/**************************************************************************

 カレンダーポップアップ
 最終更新日：2010/03/04
 更新履歴：2010/02/09　textフィールドにも対応
           2010/03/04　１フィールドだと設定日付を取ってこれてないバグ修正

***************************************************************************/

//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 = "";

var outputPosMove = true;		//true:  渡されたエレメントの位置から算出
														//false: 基本位置から

MONDAY = 1;
TUESDAY = 2;
WEDNESDAY = 3;

//■カレンダーのOPEN
// tg : 表示位置の基準オブジェクト名
// f  : 設定するform名
// i  : 設定するform element名(year,month,day分離対応)
// y  : 年
// m  : 月
function cal_open(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.getElementsByName(target);
	if (dt_field.length > 0) {	//１フィールド
		s = dt_field[0].value;
		s = s.replace("-","/");	//区切りの変換
		//数字だけの場合は日->月->年の順に区切り文字を入れる
		if (s.match(/^[0-9]+$/) && (s.length == 6 || s.length == 8)) {
			ylen = s.length - 4;
			s = s.substr(0, ylen) + "/" + s.substr(ylen, 2) + "/" + s.substr(ylen+2);
		}
		//形式エラーの場合はだめ
		if (s != "") {
			dt = new Date(s);
			if (!isNaN(dt)) {
				y = dt.getYear();
				m = dt.getMonth() + 1;
			}
		}
	} else {	//ばらばらフィールド
		dt_field = document.getElementsByTagName("select");
		for (n=0;n<dt_field.length;n++) {
			sName = dt_field[n].getAttribute("name");
			if (sName == target+"[year]") {	//年
				y = dt_field[n].value;
			} else if (sName == target+"[month]") {	//月
				m = dt_field[n].value;
			}
		}
	}

	//判断つかない場合は当月
	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;

	//表示位置の算出
	if (outputPosMove) {
		xx = -30;
		yy = 30;

		oj = objTarget;
		while(oj){ 
			xx += oj.offsetLeft;
			oj = oj.offsetParent;
		}
		oj = objTarget;
		while(oj){ 
			yy += oj.offsetTop;
			oj = oj.offsetParent;
		}
	} else {
		xx = 0;
		yy = 0;
	}
	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_create(element, year, month);	//表示

	return false;
}

//■カレンダーのClose
function cal_close() {
	var bodyElement = document.getElementsByTagName("body").item(0);
	var calenderElement = document.getElementById(area_name);
	bodyElement.removeChild(calenderElement);

	return false;
}

//■カレンダーの移動
function cal_navi(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_create(element, y, m);	//表示
}

//■カレンダー群の作成
function cal_create(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_navi("+nPrevYear+", "+nPrevMonth+", '"+image_path+"');\"><img src=\""+image_path+image_prev_file+"\" border=\"0\"></a> <a href=\"javascript:void(0);\" onclick=\"return cal_close();\"><img src=\""+image_path+image_close_file+"\" border=\"0\"></a> <a href=\"javascript:void(0);\" onclick=\"return cal_navi("+nNextYear+", "+nNextMonth+", '"+image_path+"');\"><img src=\""+image_path+image_next_file+"\" border=\"0\"></a>";
	element.insertBefore(ele, null);

	//カレンダー要素の作成 1
	cal_body(element, 1, nYear, nMonth);

	//中ナビ
	ele = document.createElement("div");
	ele.id = "cal_center";
	ele.className = "center_navi";
	element.insertBefore(ele, null);

	//カレンダー要素の作成 2
	cal_body(element, 2, nNextYear, nNextMonth);
}

//■カレンダーの本体の生成
function cal_body(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_set('"+strDate+"');\">"+dt.getDate()+"</a>";
				oldDate = dt.getDate();
			} else {
				colElement.innerHTML = dt.getDate();
			}

			//祝日判別
			if (cal_check(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_set(data) {
	var target = itemname.replace(/\./g, "][");
	target = "data["+target+"]";

	var dt_field = document.getElementsByName(target);
	//textタイプ
	if (dt_field.length >= 1) {
		dt = data.replace(/\//g, '-');
		for (n=0;n<dt_field.length;n++) {
			dt_field[n].value = dt;
		}
	//selectタイプ
	} else {
		dt_field = document.getElementsByTagName("select");
		dt = data.split('/');
		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];
			}
		}
	}

	cal_close();
	return false;
}

function cal_check(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();
}*/
