/***************************************************************************
// constractor
***************************************************************************/
function formControll(form) {
	
       this.form = form;

    this.formView = new formView(form);
	
	if(Debug) this.formView.trace();// "Firebug Console" に出力
}

/***************************************************************************
// 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.setMonthDay = function(currntMonth, currntDay, targetMonth, offsetDay, extra) {
	
	var targetMonthElem = this.formView.checkParamType(targetMonth);
	var targetDayElem = this.formView.nextElement(targetMonthElem);
	var monthElem = this.formView.checkParamType(currntMonth);
	var dayElem =  this.formView.checkParamType(currntDay);
	
	var month = this.formView.getValue(monthElem);
	var day =  this.formView.getValue(dayElem);	
	var date = getMonthDay(month, day, offsetDay);
	
	this.formView.setPulldown(targetMonthElem, date.getMonth()+1);
	this.formView.setPulldown(targetDayElem, date.getDate());
	this.resetDay(currntMonth, extra);
	this.resetDay(targetMonth, extra);
}


// 日付のリセット（その月が何日あるかを設定）
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);  
}

// フォーム送信イベント
formControll.prototype.submitForm = function() {
	
	if(this.submitBefore) this.submitBefore();

	if(Debug) {this.formView.traceFormElements(); return;}// "Firebug Console" に出力
	
	if(this.submited) return false;
	this.submited = true;
	//accessDummyForLog('dom_tic_sub');
	this.form.submit();
	
	if(this.popUp) this.popUp("./");
	
	return false;	
}



/***************************************************************************
// 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;
}


