//  ========================================================
//  JKLカレンダーにSelectBox操作機能追加
//  2007/03/30 - セレクトボックスに対応
//  ========================================================

// ※ 先に jkl-calendar.js を読み込む必要あり
// 
/***********************************************************
// HTML Sample

  <html>
    <head>
      <script type="text/javascript" src="jkl-calendar.js" charset="UTF-8"></script>
      <script type="text/javascript" src="jkl-calendar-helper.js" charset="UTF-8"></script>
    </head>
    <body>
      <form id="formid" action="">
        {html_select_date name="hoge" format="Y/n/j"} {* 2004/1/1 *}
        {html_select_date name="hoge" format="Y/m/d"} {* 2004/01/01 *}
        <a onclick="JKL.make_calendar_ddl('make_calendar','hoge');">#</a><div id="make_calendar"></div>
      </form>
    </body>
  </html>

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

/////////////////////////////////////////////////////////////////////////
// JKL.Calendarを継承し、Text用のモジュールを作成する。

JKL.CalendarTEXT = JKL.Calendar;

// テキスト入力欄のエレメントを返す

JKL.CalendarTEXT.prototype.getFormElement = function () {
    if ( this.__textelem ) return this.__textelem;
    var element = document.getElementById( this.valname );
    if ( ! element ) return;
    this.__textelem = element;
    return this.__textelem;
};


// 2008/04/17 Nakau add
// Firefox用のCSS-hack
JKL.CalendarTEXT.prototype.show = function () {
    // JKL.Calendarがァレンダー表示要素に"position: absolute"を強制するので
    // firefoxで正しく表示するためにいつでも"display: inline"を付ける
    this.getCalendarElement().style.display = "inline";
    
}
// 2008/04/17 Nakau end


/////////////////////////////////////////////////////////////////////////
// JKL.Calendarを継承し、SelectBox用のモジュールを作成する。

JKL.CalendarDDL = JKL.Calendar;

// テキスト入力欄のエレメントを返す

JKL.CalendarDDL.prototype.getFormElement = function () {
    if ( this.__textelem ) return this.__textelem;
    var Y = document.getElementById(this.valname + '[Y]'); // 年 '%4d'
    var y = document.getElementById(this.valname + '[y]'); // 年 '%4d'
    var m = document.getElementById(this.valname + '[m]'); // 月 '%02d'
    var d = document.getElementById(this.valname + '[d]'); // 月 '%d'
    var n = document.getElementById(this.valname + '[n]'); // 日 '%02d'
    var j = document.getElementById(this.valname + '[j]'); // 日 '%d'

    text_y = (Y ? Y.value : (y ? y.value : null));
    text_m = (m ? m.value : (n ? n.value : null));
    text_d = (d ? d.value : (j ? j.value : null));

    this.__textelem = {
      value: text_y + '/' + text_m + '/' + text_d,
      spliter: this.spliter,
      callback: this.callback,
      Y: Y, // 年 '%4d'
      y: y, // 年 '%4d'
      m: m, // 月 '%02d'
      n: n, // 月 '%d'
      d: d, // 日 '%02d'
      j: j, // 日 '%d'
      setValue: function (ymd) {
        var splt = ymd.split(this.spliter);
        if (this.Y) { this.Y.value = splt[0];                          }
        if (this.y) { this.y.value = splt[0];                          }
        if (this.m) { this.m.value = splt[1];                          }
        if (this.n) { this.n.value = parseInt(splt[1], 10).toString(); }
        if (this.d) { this.d.value = splt[2];                          }
        if (this.j) { this.j.value = parseInt(splt[2], 10).toString(); }

				var elements = Array(
					this.Y,
					this.y,
					this.m,
					this.n,
					this.d,
					this.j
				);

				for (var e in elements) {
					var element = elements[e];

					if(element) {
						if(element.attributes && element.attributes.onjklchange) {
							var callback = element.attributes.onjklchange.nodeValue;
							callback = callback.replace(/\bthis\b/, 'element');
							eval(callback);
						}
					}
				}
      }
    };

    return this.__textelem;
};

// フォーム入力欄に指定した値を書き込む

JKL.CalendarDDL.prototype.setFormValue = function (ymd) {
    if ( ! ymd ) ymd = this.getDateYMD();   // 無指定時はオブジェクトから？
    var form1 = this.getFormElement();
    if ( form1 ) form1.setValue(ymd);
};


/////////////////////////////////////////////////////////////////////////
// Helper Method

JKL.make_calendar = function(f_creator, callback)
{
	if ( JKL.instance == null
		|| JKL.instance.getCalendarElement().style.display == "none") {

		JKL.instance = null;
		JKL.instance = f_creator();
		JKL.instance.callback = callback;
		JKL.instance.write();
	}
	else {

		JKL.instance.hide();

		setTimeout(
			function () {
				JKL.instance = f_creator();
				JKL.instance.callback = callback;
				JKL.instance.write();
			},
			100
		);
	}
}

// TextBox用 calendar作成

JKL.make_calendar_text = function(div_id, element_id, callback)
{
	JKL.make_calendar(function() { return new JKL.CalendarTEXT(div_id, '',element_id); }, callback);
}

// TextBox用 calendar作成

JKL.make_calendar_text2 = function(div_id, element_id, form_id, callback)
{
	JKL.make_calendar(function() { return new JKL.Calendar(div_id, form_id, element_id); }, callback);
}

// SelectBox用 calendar作成

JKL.make_calendar_ddl = function(div_id, element_id, callback)
{
	JKL.make_calendar(function() { return new JKL.CalendarDDL(div_id, '',element_id); }, callback);
}

// SelectBox用 Value設定(optionsに存在しない値は先頭要素をセットする。)

JKL.select_safe_set = function(element, value) {
	if (element) {
		value = '' + value;

		for ( i=0 ; i < element.options.length ; ++i ) {
			if (element.options[i].value == value) { break; }
		}

		if (i != element.options.length) {
			element.value = value;
		}
		else {
			element.value = element.options[0].value;
		}
	}
}

// 日付型(複数要素)SelectBoxの値をdate型で取得する

JKL.select_get_date = function(element, date) {

	try {
		var y = document.getElementById(element + '[Y]');
		var m = document.getElementById(element + '[m]');
		var d = document.getElementById(element + '[d]');
		var h = document.getElementById(element + '[H]');
		var i = document.getElementById(element + '[i]');
		var s = document.getElementById(element + '[s]');

		y = (y ? y : document.getElementById(element + '[y]'));
		m = (m ? m : document.getElementById(element + '[n]'));
		d = (d ? d : document.getElementById(element + '[j]'));

		var nY = parseInt(y.value, 10);
		var nM = parseInt(m.value, 10);
		var nD = parseInt(d.value, 10);
		var nH = (h ? parseInt(h.value, 10) : null)
		var nI = (i ? parseInt(i.value, 10) : null)
		var nS = (s ? parseInt(s.value, 10) : null)

		if (isNaN(nH)) { nH = null; }
		if (isNaN(nI)) { nI = null; }
		if (isNaN(nS)) { nS = null; }

		return new Date(nY, nM-1, nD, nH, nI, nS);
	}
	catch(e) {
	}
}

// 日付型(複数要素)SelectBoxにdate型で値を設定指定する。

JKL.select_set_date = function(element, date) {

	try {
		var Y = document.getElementById(element + '[Y]');
		var y = document.getElementById(element + '[y]');
		var m = document.getElementById(element + '[m]');
		var n = document.getElementById(element + '[n]');
		var d = document.getElementById(element + '[d]');
		var j = document.getElementById(element + '[j]');

		var two_string = function(val) { 
			var value = parseInt(val, 10);
			return ( value < 10 ? '0' + value : value );
		}

		JKL.select_safe_set(Y, date.getFullYear());
		JKL.select_safe_set(y, date.getFullYear());
		JKL.select_safe_set(m, two_string(date.getMonth()+1));
		JKL.select_safe_set(n, date.getMonth()+1);
		JKL.select_safe_set(d, two_string(date.getDate()));
		JKL.select_safe_set(j, date.getDate());
	}
	catch(e) {
	}
}

// 時刻型(複数要素)SelectBoxにdate型で値を設定指定する。

JKL.select_set_time = function(element, date) {

	try {
		var h = document.getElementById(element   + '[H]');
		var i = document.getElementById(element   + '[i]');
		var s = document.getElementById(element   + '[s]');

		var two_string = function(val) { 
			var value = parseInt(val, 10);
			return ( value < 10 ? '0' + value : value );
		}

		JKL.select_safe_set(h, two_string(date.getHours()));
		JKL.select_safe_set(i, two_string(date.getMinutes()));
		JKL.select_safe_set(s, two_string(date.getSeconds()));
	}
	catch(e) {
	}
}

// 日付型(複数要素)SelectBoxを他のelement要素からコピーする。

JKL.select_copy_date = function(to_element, from_element) {

	try {
		var to_Y   = document.getElementById(to_element   + '[Y]');
		var to_y   = document.getElementById(to_element   + '[y]');
		var to_m   = document.getElementById(to_element   + '[m]');
		var to_n   = document.getElementById(to_element   + '[n]');
		var to_d   = document.getElementById(to_element   + '[d]');
		var to_j   = document.getElementById(to_element   + '[j]');
		var from_Y = document.getElementById(from_element + '[Y]');
		var from_y = document.getElementById(from_element + '[y]');
		var from_m = document.getElementById(from_element + '[m]');
		var from_n = document.getElementById(from_element + '[n]');
		var from_d = document.getElementById(from_element + '[d]');
		var from_j = document.getElementById(from_element + '[j]');

		if (from_Y) { JKL.select_safe_set(to_Y, from_Y.value); }
		if (from_y) { JKL.select_safe_set(to_y, from_y.value); }
		if (from_m) { JKL.select_safe_set(to_m, from_m.value); }
		if (from_n) { JKL.select_safe_set(to_n, from_n.value); }
		if (from_d) { JKL.select_safe_set(to_d, from_d.value); }
		if (from_j) { JKL.select_safe_set(to_j, from_j.value); }
	}
	catch(e) {
	}
}
// 時刻型(複数要素)SelectBoxを他のelement要素からコピーする。

JKL.select_copy_time = function(to_element, from_element) {

	try {
		var to_h   = document.getElementById(to_element   + '[H]');
		var to_i   = document.getElementById(to_element   + '[i]');
		var to_s   = document.getElementById(to_element   + '[s]');
		var from_h = document.getElementById(from_element + '[H]');
		var from_i = document.getElementById(from_element + '[i]');
		var from_s = document.getElementById(from_element + '[s]');

		if (from_h) { JKL.select_safe_set(to_h, from_h.value); }
		if (from_i) { JKL.select_safe_set(to_i, from_i.value); }
		if (from_s) { JKL.select_safe_set(to_s, from_s.value); }
	}
	catch(e) {
	}
}

// 日付時刻型(複数要素)にdefault要素をセットする。

JKL.select_set_default = function(element) {

	try {
		JKL.select_safe_set(document.getElementById(element + '[Y]'), 'default');
		JKL.select_safe_set(document.getElementById(element + '[y]'), 'default');
		JKL.select_safe_set(document.getElementById(element + '[m]'), 'default');
		JKL.select_safe_set(document.getElementById(element + '[n]'), 'default');
		JKL.select_safe_set(document.getElementById(element + '[d]'), 'default');
		JKL.select_safe_set(document.getElementById(element + '[j]'), 'default');
		JKL.select_safe_set(document.getElementById(element + '[H]'), 'default');
		JKL.select_safe_set(document.getElementById(element + '[i]'), 'default');
	}
	catch(e) {
	}
}
