﻿String.prototype.toDate=function(){
	var t=this.replace(/-0?/g,'/');
	var d=Date.parse(t);
	if(!isNaN(d)&&(d=new Date(d))&&[d.getFullYear(),d.getMonth()+1,d.getDate()].join('/')==t)
		return d;
	return null;
};

function bigBus(){
	$('home_city').setAttribute('mod_address_focusNext','true');
	$('ticket_city').setAttribute('mod_address_source','fltDomesticTicket');
	initCityNameToCode();
}

if ($$.status.domReadyFunc)
	$$.status.domReadyFunc.unshift(bigBus);
else
	$r("domReady", bigBus, 1);

function initCityNameToCode(){
	var v = ['HomeCity', 'DestCity1', 'DestCity2'];
	for(var i = 0; i < v.length; i ++)
		$(c_fields_map[v[i]]).setAttribute('mod_address_reference', v[i] + '_');
	window.cityNameToCode = function(form){
		for(var i = 0; i < v.length; i ++)
			form[v[i]].value = $(v[i] + '_').value;
	};

}
document.write([
	'<span style="display:none">',
	'<input type="hidden" id="HomeCity_" >',
	'<input type="hidden" id="DestCity1_" >',
	'<input type="hidden" id="DestCity2_" >',
	'</span>'
].join(''));

//提示文本
var c_msg={
	adult:'成人',
	child:'儿童',
	baby:'婴儿',
	dep:'出发',
	ret:'返回',
	noCity0:'请选择出发城市',
	noCity1:'请选择目的城市',
	noCity2:'请选择第二程目的城市',
	noDate1:'请选择出发日期',
	noDate2:'请选择返回日期',
	noDate2M:'请选择第二程出发日期',
	illegalCity0:'您选择的出发城市有误，请重新选择。',
	illegalCity1:'您选择的目的城市有误，请重新选择。',
	illegalCity2:'您选择的第二程目的城市有误，请重新选择。',
	illegalCity3:'您选择的送票城市有误，请重新选择。',
	illegalDate1:'日期格式为yyyy-mm-dd',
	illegalDate2:'日期格式为yyyy-mm-dd',
	sameCity1:'您选择的目的城市与出发城市相同，请重新选择',
	sameCity2:'您选择的第二程目的城市与第一程目的城市相同，请重新选择',
	tooEarly1:'您选择的出发日期早于今天，请重新选择。',
	tooEarly2:'您选择的返回日期早于出发日期，请重新选择。',
	tooEarly2M:'您选择的第二程出发日期早于第一程出发日期，请重新选择。'
};

for(var s in c_msg) c_msg[s] = $s2t(c_msg[s]);

//隐藏字段及界面缺省值
var c_fields={
//	RequestFlightWay:"",			//?
//	RequestAirline:"",			//?
//	CurrentDate:"2008/02/21 11:02",	//当前日期
	FlightWay:"D",			//航程类型
	HomeCity:"",		//出发城市
	DestCity1:"",		//目的城市1
	DestCity2:"",		//目的城市2
	TicketAgency_List:"",	//送票城市
	DDatePeriod1:"",		//出发日期1
	startPeriod:"All",		//出发时间1
	ADatePeriod1:"",		//出发日期2
	startPeriod2:"All",		//出发时间2
	ChildType:"ADU",			//乘客类型
	airlineChoice:"All",		//航空公司
	DSeatClass:"Y",			//舱位等级
	Quantity:"1"				//乘客数量
};

//映射
var c_fields_map={
	FlightWay:"flight_type",			//航程类型
	airlineChoice:"flight_company",		//航空公司
	startPeriod:"depart_time_1",		//出发时间1
	startPeriod2:"depart_time_2",		//出发时间2
	HomeCity:"home_city",				//出发城市
	DestCity1:"dest_city_1",			//目的城市1
	DestCity2:"dest_city_2",			//目的城市2
	TicketAgency_List:"ticket_city",	//送票城市
	DDatePeriod1:"depart_date_1",		//出发日期1
	ADatePeriod1:"depart_date_2",		//出发日期2
	DSeatClass:"bunk_grade",			//舱位等级
	ChildType:"age_type",				//乘客类型
	Quantity:"passenger_count"			//乘客数量
};

//cookie字段
var c_cookie_fields={
	HomeCity:'',
	DestCity1:'',
	DestCity2:'',
	TicketAgency_List:''
};
var c_cookie_key='fltDomestic';
var c_cookie_domain=document.domain.split('.').slice(1).join('.');

//查询条件设置字段
var c_ext_fields={
	FlightWay:'',
	airlineChoice:''
};
var c_ext_fields_map={
	FlightWay:'RequestFlightWay',
	airlineChoice:'RequestAirline'
};

//校验字段
var c_validate_fields={
	HomeCity:[
		'SDM',
		'hasChar:noCity0',
		'legal:illegalCity0'
	],
	DDatePeriod1:[
		'SDM',
		'hasChar:noDate1',
		'isDate:illegalDate1',
		'laterThan_today:tooEarly1'
	],
	DestCity1:[
		'SDM',
		'hasChar:noCity1',
		'legal:illegalCity1',
		'differentFrom_HomeCity:sameCity1'
	],
	ADatePeriod1:[
		'DM',
		'hasChar:noDate2',
		'isDate:illegalDate2',
		'laterThan_DDatePeriod1:tooEarly2'
	],
	DestCity2:[
		'M',
		'hasChar:noCity2',
		'legal:illegalCity2',
		'differentFrom_DestCity1:sameCity2'
	],
	TicketAgency_List:[
		'SDM',
		'legal:illegalCity3'
	]
};

//校验函数
var c_validator={
	hasChar:function(v){
		return /\S/.test(v);
	},
	legal:function(v){
		return !/["'<>@#$%^*+=]/.test(v);
	},
	isDate:function(v){
		return !!v.toDate();
	},
	laterThan:function(v1,v2){
		if(v2=='today'){
			var d=new Date();
			return v1.toDate()>=new Date(d.getFullYear(),d.getMonth(),d.getDate());
		}else{
			return v1.toDate()>=v2.toDate();
		}
	},
	differentFrom:function(v1,v2){
		return  v1.substring(0,2)!=v2.substring(0,2);
	}
};

var Cookie=function(key,flds,config){
	this.key=key;
	this.fields=flds||{};
	this.config=config||{};
};
Cookie.prototype={
	get:function(){
		var a=document.cookie.split('; ');
		var m=[];
		for(var i=0;i<a.length;i++){
			if(a[i].indexOf(this.key+'=')==0){
				m=a[i].slice(this.key.length+1).split('&');
				break;
			}
		}
		var t={};
		for(var i=0;i<m.length;i++){
			var p=m[i].split('=');
			if(p.length>1&&(p[0] in this.fields))
				t[p[0]]=unescape(p[1]);
		}
		return mergeObjects(this.fields,t);
	},
	set:function(data){
		var a=[],c=this.config;
		for(var s in data)
			a.push(s+'='+escape(data[s]));
		a=[this.key+'='+a.join('&')];
		for(var s in c)
			a.push(s+'='+c[s]);
		document.cookie=a.join('; ');
	},
	remove:function(){
		var t=new Date();
		t.setYear(t.getFullYear()-1);
		document.cookie=this.key+'=; expires='+t.toGMTString();
	}
};

var UIElement=function(form,name){
	var ele=$(name);
	if(!ele||ele.id!=name)
		ele=form[name];
	if(ele){
		var el,typ,tip;
		if(ele.length&&/input/i.test(ele[0].tagName))
			el=ele[0];
		else
			el=ele;
		if(/input|textarea/i.test(el.tagName)){
			typ=el.type;
			if(typ!='radio'&&typ!='checkbox'){
				if(el.module&&el.module.notice)
					tip=el.module.notice.tip;
				typ='text';
			}
		}else if(/select/i.test(el.tagName)){
			typ='select';
		}
		this.ele=ele;
		this.type=typ;
		this.notice=tip;
	}
	this.name=name;
};
UIElement.prototype={
	setValue:function(value){
		if(!this.ele)
			return;
		value=value||'';
		if(this.type=='text'){
			this.ele.value=value;
			if(this.notice)
				this.ele.module.notice.check();
		}else if(this.type=='radio'){
			for(var i=0,a=this.ele;i<a.length;i++)
				a[i].checked=a[i].value==value;
		}else if(this.type=='checkbox'){
			var v={};
			if(typeof value=='string')
				value=value.split(',');
			if(value.constructor==Array){
				for(var i=0;i<value.length;i++)
					v[value[i]]=1;
			}else{
				v=value;
			}
			for(var i=0,a=this.ele;i<a.length;i++)
				a[i].checked=a[i].value in v;
		}else{
			this.ele.value=value;
		}
	},
	getValue:function(){
		if(!this.ele)
			return '';
		var v=this.ele.value;
		if(this.type=='text'){
			if(this.notice)
				return v==this.notice?'':v;
			else
				return v;
		}else if(this.type=='radio'){
			for(var i=0,a=this.ele;i<a.length;i++)
				if(a[i].checked)
					return a[i].value;
			return null;
		}else if(this.type=='checkbox'){
			var v=[];
			for(var i=0,a=this.ele;i<a.length;i++)
				if(a[i].checked)
					v.push(a[i].value);
			return v;
		}else{
			return v;
		}
	},
	watchChange:function(func){
		if(!this.ele)
			return;
		var me=this;
		var fn=function(){
			func(me.getValue(),this);
		};
		if(/radio|checkbox/.test(this.type))
			for(var i=0,a=this.ele;i<a.length;i++)
				a[i].onclick=fn;
		else
			this.ele.onchange=fn;
	}
};

window.$r('domready',pageInit);

function pageInit() {
    $('home_city').setAttribute('mod_address_focusNext', 'false');
	if(window.initFlag)
		return;
	window.initFlag=true;
	
	//for IE6  :-(
	showBox.lbs=[];
	['depart_time_1','depart_time_2'].each(function wrap(id){
		if(!$(id)) return;
		var txtNode = $(id).previousSibling;
		var span = document.createElement('span');
		span.innerHTML = '&nbsp;' + txtNode.nodeValue.trim();
		txtNode.parentNode.insertBefore(span, txtNode);
		txtNode.nodeValue = ' ';
		showBox.lbs.push(span.firstChild);
	});
	showBox.lbs[0] = $('depart_date_2').previousSibling;

	var form=document.forms[0];

	//cookie
	var t=new Date();
	t.setYear(t.getFullYear()+1);
	var cookie=new Cookie(
		c_cookie_key,
		c_cookie_fields,
		{
			expires:t.toGMTString(),
			domain:c_cookie_domain
		}
	);

	//是否为快速搜索
	var qsearch=!$('depart_time_1');
	
	//单程往返联程
	var FlightType=new UIElement(form,'flight_type'); // S, D, M
	FlightType.watchChange(showBox);
	
	//成人儿童婴儿
	var AgeType=new UIElement(form,'age_type'); // ADU, CHI, BAB
	AgeType.watchChange(showTip);
	
	//初始化
	var data={};
	if(qsearch){
		data=getFromHidden(form,c_fields);
		setToUi(form,data,c_fields_map);
	}
	/*
	else{
		data=cookie.get();
		if(data.DestCity2)
			data.FlightWay='M';
		//查询条件设置
		addExtFields(form,data);
		setToUi(form,data,c_fields_map);
	}
	*/
	data=getFromUi(form,{ChildType:'',FlightWay:''},c_fields_map);
	showTip(data.ChildType);
	showBox(data.FlightWay);

	//存cookie
	if(false) window.onbeforeunload=function(){
		if(!qsearch){
			if(!window.submitFlag){
				uiToHidden(form);
				checkFlightType(form);
			}
			cookie.set(getFromHidden(form,c_cookie_fields));
		}
	};
};

function addExtFields(form,data){
	var d0=getFromUi(form,c_ext_fields,c_fields_map);
	var d1=getFromHidden(form,c_ext_fields,c_ext_fields_map);
	for(var s in d0)
		if(d0[s]==c_fields[s]&&d1[s])
			data[s]=d1[s];
}

function submitQuery(action){
	var form=document.forms[0];
	uiToHidden(form);
	if(!validateQuery(form,checkFlightType(form)))
		return false;
	form.action=action;
	if(form.__VIEWSTATE)
		form.__VIEWSTATE.name = "NOVIEWSTATE";
	cityNameToCode(form);
	form.submit();
	window.submitFlag=true;
}

function mergeObjects(){
	var r={};
	for(var i=0;i<arguments.length;i++){
		var b=arguments[i];
		for(var s in b)
			r[s]=b[s];
	}
	return r;
}

function uiToHidden(form){
	var data=getFromUi(form,c_fields,c_fields_map);
	setToHidden(form,data);
}
function getFromUi(form,flds,map){
	var r={};
	for(var s in flds)
		if(s in form)
			r[s]=new UIElement(form,map?map[s]:s).getValue();
	return r;
}
function setToUi(form,data,map){
	var r={};
	for(var s in data)
		if(s in form)
			new UIElement(form,map?map[s]:s).setValue(data[s]);
}
function getFromHidden(form,flds,map){
	var r={};
	for(var s in flds){
		var u=map?map[s]:s;
		if(u in form)
			r[s]=form[u].value;
	}
	return r;
}
function setToHidden(form,data,map){
	for(var s in data){
		var u=map?map[s]:s;
		if(u in form)
			form[u].value=data[s];
	}
}

function validateQuery(form,fltType){
	for(var s in c_validate_fields){
		var a=c_validate_fields[s];
		if(a[0].indexOf(fltType)<0)
			continue;
		for(var i=1;i<a.length;i++){
			var b=a[i].split(':');
			var fun=b[0].split('_');
			var msg=c_msg[b[1]];
			if(fltType=='M'&&((b[1]+fltType) in c_msg))
				msg=c_msg[b[1]+fltType];
			var arg=[form[s].value];
			if(fun.length>1)
				for(var j=1;j<fun.length;j++)
					arg.push(form[fun[j]]?form[fun[j]].value:fun[j]);
			if(!c_validator[fun[0]].apply(null,arg)){
				$alert($(c_fields_map[s]),msg);
				return false;
			}
		}
	}
	return true;
}

function checkFlightType(form){
	var r=form.FlightWay.value;
	if(r=='D'){
		var d=form.ADatePeriod1.value;
		if(!/\S/.test(d))
			r='S';
	}
	if(r!='M')
		form.DestCity2.value='';
	if(r=='S')
		form.ADatePeriod1.value='';
	if(!form.TicketAgency_List.value)
		form.TicketAgency_List.value=form.HomeCity.value.replace(/\(.*$/,"");
	return form.FlightWay.value=r;
}

function showTip(ageType){
	var spanTip=$('age_type_tip');
	if(!spanTip)
		return;
	var lblText=spanTip.getElementsByTagName('label');
	if(!lblText.length)
		return;
	if(ageType=='ADU')
		spanTip.style.display='none';
	else{
		spanTip.style.display='';
		var text=({
			ADU:c_msg.adult,
			CHI:c_msg.child,
			BAB:c_msg.baby
		})[ageType];
		for(var i=0;i<lblText.length;i++)
			lblText[i].innerHTML=text;
	}
}

function showBox(fltType){
	var box1=$('div_dest1');
	var box2=$('div_dest2');
	
	var text0=fltType=='D'?c_msg.dep:c_msg.ret;
	var text1=fltType=='D'?c_msg.ret:c_msg.dep;
	var l = showBox.lbs;
	if(l[0]) l[0].nodeValue = l[0].nodeValue.replace(text0, text1);
	if(l[1]) l[1].nodeValue = l[1].nodeValue.replace(text0, text1);
	
	show(box1,fltType!='S',true);
	show(box2,fltType=='M',true);
	function show(el,b){
		el.style.display=b?'':'none';
	}
}