/***************************************************************************
// constractor
***************************************************************************/
function formControll(form) {
	
	this.form = form;
    this.formView = new formView(form);
}

/***************************************************************************
// method
***************************************************************************/

formControll.prototype.init = function() {}

// 月日をセットする（現在の日付を基準とする）
formControll.prototype.setOffsetDay = function(targetMonth, targetDay, offsetDay) {
	var monthElem = this.formView.checkParamType(targetMonth);	
	var date = getOffsetDate(offsetDay);
	this.formView.setPulldown(targetMonth, date.getMonth()+1);
	this.formView.setPulldown(targetDay, date.getDate());
	this.resetDay(monthElem);
}


// 日付のリセット（その月が何日あるかを設定）
formControll.prototype.resetDay = function(monthElem, extra) {
	var elem = this.formView.checkParamType(monthElem);
	
	var dayElem = this.formView.nextElement(elem);
	var dayIndex = getDayIndex(elem, dayElem);
	var month = this.formView.getValue(elem)*1;
	
	var tempList;
	if(typeof extra == "undefined") {
		
		tempList = day_list.slice(0, getDaylength(month));
	} else {
		
		tempList = day_list.slice(0, getDaylength(month));
		tempList.unshift(extra);// EX){value:"", text:"--日"}
	}

	this.formView.createPulldown(dayElem, tempList);	
	this.formView.setPulldown(dayElem, dayIndex);
}


// 月プルダウン変更　=>　日付のリセット（その月が何日あるかを設定）
formControll.prototype.monthListener = function(eventObj) {

	var evt = this.getEventTarget(eventObj);
	if(evt) this.resetDay(evt);
}


// プルダウン連鎖処理（隣り合うものに限る）
formControll.prototype.relationListener = function(eventObj) {

	var evt = this.getEventTarget(eventObj);
	if(!evt) evt = eventObj;
	var targetElem = this.formView.nextElement(evt);
	var val = this.formView.getValue(evt);
	this[evt.name](evt, val, targetElem);
}


// yymmdd形式でセットする
formControll.prototype.setyymmdd = function(targetMonth, targetDay, targetyymmdd, extra) {
	
	var monthElem = this.form[targetMonth];
	var dayElem = this.form[targetDay];
	var yymmddElem = this.form[targetyymmdd];

	var yymmdd = getyymmdd(getSelectedValue(monthElem), getSelectedValue(dayElem));
	
	if(extra == "Y") yymmdd = yymmdd.slice(0, 4);
	if(extra == "M") yymmdd = yymmdd.slice(4, 6);
	if(extra == "D") yymmdd = yymmdd.slice(6, 8);
	
	this.formView.setDynamicParam(yymmddElem, yymmdd);  
}


/***************************************************************************
// event
***************************************************************************/

// イベントのセット
formControll.prototype.addEvent = function(element, eventType, listener) {
	
	var elem = this.formView.checkParamType(element);
	
	if(elem.addEventListener) {
		elem.addEventListener(eventType, listener, false);
		return true;
	}
	else if(elem.attachEvent) {
		var r = elem.attachEvent("on" + eventType, listener);
		return r;
	}
	else {
		elem["on" + eventType] = listener;
	}
}

// イベントの委譲（スコープを呼び出した関数に持つ）
formControll.prototype.delegate = function(obj, func) {
	
	var f = function () {
		var _target = arguments.callee.target;
		var _func = arguments.callee.func;
		return _func.apply(_target, arguments);
	};
	f.target = obj;
	f.func = func;
	return f;
}

// イベントターゲットを返す（IEとW3Cのイベントモデルを判別）
formControll.prototype.getEventTarget = function(evt) {
	
	evt = (evt) ? evt : ((window.event) ? event : null);
	if(evt) var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
	
	return elem;
}

//**************************************************************************/
// calendar
//**************************************************************************/

// 各月の末日リスト
last_day = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];

// カレンダー（ポップアップ）からの値を受け取ってセット
function setDateFromCal(selectMon, selectDay) {

	var targetMon  = document.atourForm.elements[4];
	var targetDay  = document.atourForm.elements[5];

	for (i = 0; i < targetMon.length; i++) {
		if (targetMon.options[i].value == selectMon) {
			targetMon.selectedIndex = i;
			break;
		}
	}

	//うるう年対応
	var cd = new Date();
	var yy = cd.getYear();
	var mm = cd.getMonth();

	if (mm > 2) {
		yy++;
	}
	if((yy % 4==0 && yy % 100 !=0) || yy % 400 ==0){
		last_day[2] = 29;	//2月の末尾調整
	}

	var dayOffset = last_day[selectMon] - targetDay.length;

	if (dayOffset > 0) {
		var startIdx = targetDay.length;
		targetDay.length = targetDay.length + dayOffset;

		for (i = startIdx; i < targetDay.length; i++) {
			var dayStr = i + 1;
			targetDay.options[i] = new Option(dayStr + "日", dayStr, false, false);
		}
	}
	else {
		targetDay.length = targetDay.length + dayOffset;
	}

	targetDay.selectedIndex = selectDay - 1;
}



