/***************************************************************************
// 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.monthListenerAddWeek = function(eventObj) {

	var evt = this.getEventTarget(eventObj);
	if(evt) this.resetDay(evt);
    
    // 曜日付与
	this.formView.addWeekPulldown(this.formView.nextElement(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;

	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;
}

//**************************************************************************/


// カレンダー（ポップアップ）からの値を受け取ってセット
formControll.prototype.setDateFromCal2 = function(cmonth, cday, monthElem, dayElem) {
	this.formView.setPulldown(monthElem.name, cmonth);
	this.formView.setPulldown(dayElem.name, cday);
	this.resetDay(monthElem);
}

//**************************************************************************/

// フォームオブジェクトマップ
var target_form = { 
	"dom_tic"	:	"targetForm = document.segConditionForm",
	"dom_airhotel":	"targetForm = document.domTcktHtl",
	"dom_hotel"	:	"targetForm = document.domHtRtHt",
	"dom_rent1"	:	"targetForm = document.domHtRtRt",
	"dom_rent2"	:	"targetForm = document.domHtRtRt",
	"dom_tra"	:	"targetForm = document.atourForm",
	"dom_pack1"	:	"targetForm = document.domTourPack",

	"i1" 		:	"targetForm = document.TABLE",
	"i2" 		:	"targetForm = document.TABLE",
	"int_hotel" :	"targetForm = document.intTkHtHt",
	"int_rent1"	:	"targetForm = document.intTkHtTkHt",
	"int_rent2" :	"targetForm = document.intTkHtTkHt",
	"int_tra1" 	:	"targetForm = document.tabisakuInt",
	"int_tra2" 	:	"targetForm = document.tabisakuInt",
	"int_pack1" :	"targetForm = document.atourPackInt",

	"dom_pack2"	:	"targetForm = document.dom_cd",
	"int_pack2" :	"targetForm = document.int_cd"
};

// カレンダー配置マップ
var target_obj_idx = { 
	"dom_tic"	:	[4,  5],
	"dom_airhotel":	[4,  5],
	"dom_hotel"	:	[0,  1],
	"dom_rent1"	:	[1,  2],
	"dom_rent2"	:	[6,  7],
	"dom_tra"	:	[4,  5],
	"dom_pack1"	:	[4,  5],

	"i1" 		:	[5,  6],
	"i2" 		:	[7,  8],
	"int_hotel" :	[3,  4],
	"int_rent1"	:	[3,  4],
	"int_rent2" :	[5,  6],
	"int_tra1" 	:	[10,11],
	"int_tra2" 	:	[12,13],
	"int_pack1" :	[8,  9],

	"dom_pack2" :	[2,  3],
	"int_pack2" :	[3,  4]
};

// 各月の末日リスト
last_day = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];

// カレンダー（ポップアップ）からの値を受け取ってセット
function setDateFromCal(selectMon, selectDay, id) {

	var targetForm;
	eval(target_form[id]);

	var targetMon  = targetForm.elements[target_obj_idx[id][0]];
	var targetDay  = targetForm.elements[target_obj_idx[id][1]];

	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 (id == "i1" || id == "i2") dayOffset++;

	if (dayOffset > 0) {
		var startIdx = targetDay.length;
		targetDay.length = targetDay.length + dayOffset;

		for (i = startIdx; i < targetDay.length; i++) {
			var dayStr = (id == "i1" || id == "i2") ? i : i + 1;
			targetDay.options[i] = new Option(dayStr + "日", dayStr, false, false);
		}
	}
	else {
		targetDay.length = targetDay.length + dayOffset;
	}

	targetDay.selectedIndex = (id == "i1" || id == "i2") ? selectDay : selectDay - 1;

    // 国内航空券 曜日付与
    if (id == "dom_tic") {
		dom_ticket.formView.addWeekPulldown(targetDay);
	}

    // 国際航空券 曜日付与
    if (id == "i1" || id == "i2") {
		int_ticket.formView.addWeekPulldown(targetDay);
	}

	// 国際旅行復路連動
	if (id == "int_tra1") {
		int_free.PAMDPD_day(targetDay, "09", targetForm.elements[target_obj_idx[id][1]+1]);
	}

	// 国際航空券＋ホテル復路連動
	if (id == "int_rent1") {
		int_tichotel.PAMFDD(targetDay, "", targetForm.elements[target_obj_idx[id][1]+1]);
	}

	// 国内レンタカー終了日時連動
	if (id == "dom_rent1") {
		dom_rentcar.START_DD_day(targetDay, "", targetForm.elements[target_obj_idx[id][1]+1]);
	}
}

// カレンダー用ポップアップ
function openCalendar(id) {
	
	window.open('/asw/Calendar?condition=0&type=' + id,'FlightDomainCalendar','width=490,height=285,status=no,scrollbars=no,resizable=no').focus();
	return false;
}
