DateSelector = function(oConfig, tagMngr)
{
	this.init(oConfig)
}

DateSelector.prototype = {
	
	/*
	 * props
	 */
	dStart: {ol: null, btn: null, tbox: null, value: null, view: 'dStartField', olBodyId: 'sdOl'},
	dEnd:	{ol: null, btn: null, tbox: null, value: null, view: 'dEndField', olBodyId: 'edOl'},
	tStart:	{ol: null, btn: null, tbox: null,
			 view:		'tStartField',
			 olBodyId:	'stOl',
			 value:		{h: '0', m: '00'},
			 idx:		{h: 0, m: 0},
			 selected:	{h: false, m: false}
			},
	tEnd:	{ol: null, btn: null, tbox: null,
			 view:		'tEndField',
			 olBodyId:	'etOl',
			 value:		{h: '0', m: '00'},
			 idx:		{h: 0, m: 0},
			 selected:	{h: false, m: false}
			},
	
	/*
	 * methods
	 */
	init: function(oConfig)
	{
		// start date
		this.dStart.ol	= new YAHOO.widget.Overlay("olDStart");
		this.dStart.btn	= new YAHOO.widget.Button({
											type:	"menu", 
											id:		"btnDStart", 
											label:	"日付", 
											menu:	this.dStart.ol, 
											container:	YAHOO.util.Dom.get(this.dStart.view)});
		this.dStart.tbox	= YAHOO.util.Dom.get('start_date');
		var sDParams	= {target: 'start', start: this.dStart, end: this.dEnd};
		this.dStart.btn.on('click', this.showCalendar, sDParams);
		
		// end date
		this.dEnd.ol	= new YAHOO.widget.Overlay("olDEnd");
		this.dEnd.btn	= new YAHOO.widget.Button({
											type:	"menu", 
											id:		"btnDEnd", 
											label:	"日付", 
											menu:	this.dEnd.ol, 
											container:	YAHOO.util.Dom.get(this.dEnd.view)});
		this.dEnd.tbox	= YAHOO.util.Dom.get('end_date');
		var eDParams	= {target: 'end', start: this.dStart, end: this.dEnd};
		this.dEnd.btn.on('click', this.showCalendar, eDParams);
		
		// start time
		this.tStart.ol = new YAHOO.widget.Overlay("olTStart");
		this.tStart.tbox	= YAHOO.util.Dom.get('start_time');
		this.tStart.btn	= new YAHOO.widget.Button({
											type:	"menu", 
											id:		"btnTStart", 
											label:	"時間", 
											menu:	this.tStart.ol, 
											container:	YAHOO.util.Dom.get(this.tStart.view)});
		var sTParams	= {target: 'start', sd: this.dStart, ed: this.dEnd, start: this.tStart, end: this.tEnd};
		this.tStart.btn.on('click', this.showTimeList, sTParams);
		
		// end time
		this.tEnd.ol = new YAHOO.widget.Overlay("olTEnd");
		this.tEnd.tbox	= YAHOO.util.Dom.get('end_time');
		this.tEnd.btn	= new YAHOO.widget.Button({
											type:	"menu", 
											id:		"btnTEnd", 
											label:	"時間", 
											menu:	this.tEnd.ol, 
											container:	YAHOO.util.Dom.get(this.tEnd.view)});
		var eTParams	= {target: 'end', sd: this.dStart, ed: this.dEnd, start: this.tStart, end: this.tEnd};
		this.tEnd.btn.on('click', this.showTimeList, eTParams);
		
	},
	
	showCalendar: function(btn, oParams)
	{
		
		var oDate	= (oParams.target == 'start') ?  oParams.start : oParams.end;
		
		// init overlay
		oDate.ol.setBody("");
		oDate.ol.body.id	= oDate.olBodyId;
		oDate.ol.render(YAHOO.util.Dom.get(oDate.view));
		oDate.ol.align();
		
		var now	= new Date();
		var defMindate	= (now.getMonth() + 1) + '/' + now.getDate() + '/' + now.getFullYear();
		
		// init japanized calendar on overlay
		var oCal	= new YAHOO.widget.Calendar("dateCal", oDate.ol.body.id, {mindate: defMindate});
		oCal.cfg.setProperty("MDY_YEAR_POSITION", 1);
		oCal.cfg.setProperty("MDY_MONTH_POSITION", 2);
		oCal.cfg.setProperty("MDY_DAY_POSITION", 3);
		oCal.cfg.setProperty("MY_YEAR_POSITION", 1);
		oCal.cfg.setProperty("MY_MONTH_POSITION", 2);
		oCal.cfg.setProperty("MONTHS_SHORT",   ["1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"]);
		oCal.cfg.setProperty("MONTHS_LONG",    ["1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"]);
		oCal.cfg.setProperty("WEEKDAYS_1CHAR", ["\u65E5", "\u6708", "\u706B", "\u6C34", "\u6728", "\u91D1", "\u571F"]);
		oCal.cfg.setProperty("WEEKDAYS_SHORT", ["\u65E5", "\u6708", "\u706B", "\u6C34", "\u6728", "\u91D1", "\u571F"]);
		oCal.cfg.setProperty("WEEKDAYS_MEDIUM",["\u65E5", "\u6708", "\u706B", "\u6C34", "\u6728", "\u91D1", "\u571F"]);
		oCal.cfg.setProperty("WEEKDAYS_LONG",  ["\u65E5", "\u6708", "\u706B", "\u6C34", "\u6728", "\u91D1", "\u571F"]);
		oCal.cfg.setProperty("MY_LABEL_YEAR_POSITION",  1);
		oCal.cfg.setProperty("MY_LABEL_MONTH_POSITION",  2);
		oCal.cfg.setProperty("MY_LABEL_YEAR_SUFFIX",  "\u5E74");
		oCal.cfg.setProperty("MY_LABEL_MONTH_SUFFIX",  "");
        oCal.changePageEvent.subscribe(
				function ()
				{window.setTimeout(
					function ()
					{
	 	               oDate.ol.show();
	            	},
	            0);});
		oCal.selectEvent.subscribe(
				function (p_sType, p_aArgs)
				{
					var aDate,nMonth,nDay,nYear,sValue;
					if (p_aArgs)
					{
						aDate	= p_aArgs[0][0];
						nMonth	= aDate[1];
						nDay	= aDate[2];
						nYear	= aDate[0];
						sValue	= nYear + "/" + nMonth + "/" + nDay;
//						oDate.btn.set("label", sValue);
						oDate.tbox.value	= sValue;
						oDate.value	= sValue;
						if (oParams.target == 'start' && oParams.end.value == null)
						{
							oParams.end.value		= sValue;
							oParams.end.tbox.value	= sValue;
						}
					}
					oDate.ol.hide();
				});
		
		if (oParams.target == 'end' && oParams.start.value != null)
		{
			oCal.cfg.setProperty("mindate", oParams.start.value, false);
		}
		if (oParams.target == 'start' && oParams.end.value != null)
		{
			oCal.cfg.setProperty("maxdate", oParams.end.value, false)
		}
		oCal.render();
	},

	showTimeList: function(btn, oParams)
	{
		var oTime	= (oParams.target == 'start') ?  oParams.start : oParams.end;
		
		var oH	= [
			0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,
			12,13,14,15,16,17,18,19,20,21,22,23
		];
		var oM	= [
			'00','05','10','15','20','25',
			'30','35','40','45','50','55'
		];
		
		var bd	= '';
		bd	+= '<div id="sHH">時</div>';
		bd	+= '<div id="sMH">分</div>';
		bd	+= '<div class="clear"><br /></div>';
		bd	+= '<div id="hR"><div id="hS">';
		for (idx in oH)
		{
			if (oTime.idx.h != idx)
			{
				bd += '<div id="h-' + idx + '" class="sH">' + oH[idx] + '</div>';
			}
			else
			{
				bd += '<div id="h-' + idx + '" class="hSelected">' + oH[idx] + '</div>';
			}
		}
		bd	+= '</div></div><div class="mR"><div id="mS">';
		for (idx in oM)
		{
			if (oTime.idx.m != idx)
			{
				bd	+= '<div id="m-' + idx + '" class=\"sM\">' + oM[idx] + '</div>';
			}
			else
			{
				bd	+= '<div id="m-' + idx + '" class=\"mSelected\">' + oM[idx] + '</div>';
			}
		}
		bd	+= '</div>';
		bd 	+= '<div class="clear"><br /></div><div class="closeDSel">[<a href="#"> 決定 </a>]</div>';
		
		oTime.ol.setBody(bd);
		oTime.ol.body.id	= oTime.olBodyId;
		oTime.ol.render(YAHOO.util.Dom.get(oTime.view));
		oTime.ol.hide();
		
		// hour element click handler
		var handlerHClick	= function(ev, oTime)
		{
			YAHOO.util.Dom.getElementsByClassName('hSelected')[0].className	= 'sH';
			var target	= YAHOO.util.Event.getTarget(ev);
			sIdx				= target.id.split('-');
			oTime.idx.h			= sIdx[1];
			oTime.value.h		= oH[sIdx[1]];
			oTime.selected.h	= true;
			oTime.tbox.value	= oH[sIdx[1]] + ':' + oTime.value.m;
			target.className	= 'hSelected';
		}
		// minute element click handler
		var handlerMClick	= function(ev, oTime)
		{
			YAHOO.util.Dom.getElementsByClassName('mSelected')[0].className	= 'sM';
			var target	= YAHOO.util.Event.getTarget(ev);
			sIdx				= target.id.split('-');
			oTime.idx.m			= sIdx[1];
			oTime.value.m		= oM[sIdx[1]];
			oTime.selected.m	= true;
			oTime.tbox.value	= oTime.value.h + ':' + oM[sIdx[1]];
			target.className	= 'mSelected';
		}
		
		var handlerMouseOver	= function(ev, oTime)
		{
			var target	= YAHOO.util.Event.getTarget(ev);
			if (target.className == 'sM')
			{
				target.className	= 'mHl';
			}
			else if (target.className == 'sH')
			{
				target.className	= 'hHl';
			}
		}
		
		var handlerMouseOut	= function(ev, oTime)
		{
			var target	= YAHOO.util.Event.getTarget(ev);
			if (target.className == 'mHl')
			{
				target.className	= 'sM';
			}
			else if (target.className == 'hHl')
			{
				target.className	= 'sH';
			}
		}
		
		var handlerClose = function(ev, oTime)
		{
			oTime.ol.hide();
			YAHOO.util.Event.stopEvent(ev);
		}
		
		var hEls	= YAHOO.util.Dom.getElementsByClassName('sH');
		var mEls	= YAHOO.util.Dom.getElementsByClassName('sM');
		var hSld	= YAHOO.util.Dom.getElementsByClassName('hSelected');
		var mSld	= YAHOO.util.Dom.getElementsByClassName('mSelected');
		
		YAHOO.util.Event.addListener(
				[hEls,hSld],
				'click',
				handlerHClick,
				oTime
				);
		YAHOO.util.Event.addListener(
				[mEls,mSld],
				'click',
				handlerMClick,
				oTime
				);

		YAHOO.util.Event.addListener(
				[hEls, mEls, hSld, mSld],
				'mouseover',
				handlerMouseOver,
				oTime
				)
		YAHOO.util.Event.addListener(
				[hEls, mEls, hSld, mSld],
				'mouseout',
				handlerMouseOut,
				oTime
				);
		YAHOO.util.Event.addListener(
				YAHOO.util.Dom.getElementsByClassName('closeDSel'),
				'click',
				handlerClose,
				oTime
				);
				
		oTime.ol.align();
		oTime.ol.show();
	}

}
