var expe={
	sf:{
		m:{}
	,	v:{}
	,	c:{}
	,	initialize:function(){
			this.parseQueryString();
			document.write(expe.html.styleSheet(this.styleSheet));
			document.write(expe.html.div('ExpeSf','ExpeSf',expe.html.div('ExpeSf_View','','') + '<input id="ExpeSf_Data" type="hidden" value="" />'));
			this.start();
		}
	,	start:function(){
			if(document.getElementById('ExpeSf_View') && document.getElementById('ExpeSf_Data')){
				this.m = expe.sf.model.create();
				this.m.setProductList(this.queryList['product']);
				this.m.setProductType(this.queryList['default']);
				this.m.setCJData(this.queryList['aid'],this.queryList['pid'],this.queryList['sid']);
				this.m.setExpeData(this.queryList['tpid'],this.queryList['eapid']);
				this.m.setPopup(this.queryList['popup']);
				this.m.setTarget(this.queryList['target']);

				this.v = expe.sf.view.create(this.m);	
				this.v.addSub(expe.sf.baseView.create(this.m));
				
				this.c = expe.sf.controller.create(this.m,this.v);
				this.c.initialize(document.getElementById('ExpeSf_Data'),document.getElementById('ExpeSf_View'));
			}
			else{
				setTimeout('expe.sf.start();',100);
			}
		}	
	,	parseQueryString:function(){
			var list = this.queryString.split('&');
			for(var pair in list){
				var param = list[pair].split('=');
				this.queryList[param[0]] = param[1];
			}
		}
	,	queryList:{}
	,	queryString:''
	,	styleSheet:''
	}
};

//***** Utility *****
expe.html = {}
expe.html.styleSheet = function(_styleSheet){
	return '<link rel="stylesheet" type="text/css" href="' + _styleSheet + '" />';
};

expe.html.div = function(_id,_class,_html){
	return '<div id="' + _id + '" class="' + _class + '">' + _html + '</div>';
};

expe.html.label = function(_id,_class,_label){
	_class = (_class) ? ' class="' + _class + '"' : '';
	return '<label for="' + _id + '"' + _class + '>' + _label + '</label>';
};

expe.html.radio = function(_id,_name,_value,_class,_label,_checked){
	_checked = (_checked) ? ' checked="checked"' : '';
	_class = (_class) ? ' class="' + _class + '"' : '';
	return '<input type="radio" id="'+ _id +'" name="'+ _name +'" value="'+ _value +'"' + _checked + ' />' + expe.html.label(_id,_class,_label);
};

expe.html.textbox = function(_id,_name,_value,_class,_label){
	_label = (_label) ? expe.html.label(_id,_class,_label) : '';
	_class = (_class) ? ' class="Text ' + _class + '"' : 'Text';
	return _label + '<input type="text" id="'+ _id +'" name="'+ _name +'" value="'+ _value +'"' + _class + ' />';
};expe.sf.model = {};
expe.sf.model.create = function(){
	var model = {
		productType:''
	,	bundleType:null
	,	destination:''
	,  	origin:''
	,	startDate:''
	,	endDate:''
	,	startTime:''
	,	endTime:''
	,	cruiseDate:''
	,	cruiseDestination:null
	,	adults:null
	,	seniors:null
	,	kids:null
	,	aid:''
	,	pid:''
	,	sid:''
	,	eapid:''
	,	tpid:''
	,	target:''
	,	loadData:function(_container){
			if(_container){
				var data = eval(_container.value);
				for(var property in data){
					this[property] = data[property];
				}
			}
		}
	,	saveData:function(_container){
			_container.value = this.getJson();
		}
	,	getDate:function(){
			var date = new Date();
			return (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear();
		}
	,	getJson:function(){
			var json = [];
			for(var property in this){
				if(typeof(this[property]) != 'object' && typeof(this[property]) != 'function'){
					json[json.length] = property + ':"' + this[property] + '"';
				}
			}
			return '({' + json.join(',') + '})';
		}
	,	getLabelOf:function(_property){
			return (this.productType == 'bundles' && this.getBundle(this.bundleType).labelList && this.getBundle(this.bundleType).labelList[_property]) ? this.getBundle(this.bundleType).labelList[_property] 
				: (this.getProduct(this.productType).labelList && this.getProduct(this.productType).labelList[_property]) ? this.getProduct(this.productType).labelList[_property]
					: this.labelList[_property] ? this.labelList[_property]
						: '';
		}
	,	getValueOf:function(_property){
			return (this.getRawValueOf(_property)) ? this.getRawValueOf(_property)
				: (this.productType == 'bundles' && this.getBundle(this.bundleType).valueList && this.getBundle(this.bundleType).valueList[_property]) ? this.getBundle(this.bundleType).valueList[_property] 
					: (this.getProduct(this.productType).valueList && this.getProduct(this.productType).valueList[_property]) ? this.getProduct(this.productType).valueList[_property] 
						: (this.valueList[_property] != null) ? this.valueList[_property]
							: (this.getLabelOf(_property)) ? this.getLabelOf(_property).toString().replace(':','') 
								: '';
		}
	,	getRawValueOf:function(_property){
			return (this[_property]) ? this[_property] : '';
		}
	,	getProduct:function(_type){
			return this.productList[_type];
		}
	,	getBundle:function(_type){
			return this.bundleList[_type];
		}
	,	getTimeList:function(){
			var list = [];
			if(this.productType == 'cars'){
				for(var i = 0; i < this.timeList.length; i ++){
					if(this.timeList[i].text.indexOf(' AM') > 0|| this.timeList[i].text.indexOf(' PM') > 0){
						list[list.length] = this.timeList[i];
					}
				}
			}
			else{
				list = this.timeList;
			}  
			return list;
		}
	,	getProductList:function(){
			var list = {};
			for(var p in this.productList){
				if(this.productList[p].bit & this.productSum){
					list[p] = this.productList[p];
				}
			}
			return list;
		}
	,	getBundleList:function(){
			return this.bundleList;
		}
	,	getDestinationList:function(){
			return this.destinationList;
		}
	,	getMonthList:function(){
			return this.monthList;
		}
	,	getMaxAdults:function(){
			return 6;
		}
	,	getMaxKids:function(){
			return 6;
		}
	,	getMaxSeniors:function(){
			return 6;
		}
	,	getMaxCruiseMonths:function(){
			return 18;
		}
	,	getUrl:function(){
			var u = [];
			var origin = this.origin.substring(0,100);
			var destination = this.destination.substring(0,100);
			if(this.aid && this.pid){
				u[u.length] = 'http://www.anrdoezrs.net/click-' + this.pid + '-' + this.aid + '?';
				if(this.sid){
					u[u.length] = 'sid=' + this.sid + '&';
				}
			}
			else{
				u[u.length] = 'http://www.expedia.com/pubspec/scripts/eap.asp?';
				if(this.tpid && this.eapid){
					u[u.length] = 'eapid=' + this.eapid + '-' + this.tpid + '&';
				}
			}
			switch(this.productType){
				case 'flights':
					u[u.length] = 'goto=EXPFLTWIZ' + '&FrAirport=' + origin + '&ToAirport=' + destination + '&FromDate=' + this.startDate + '&ToDate=' + this.endDate;
					u[u.length] = '&NumAdult=' + this.getValueOf('adults') + '&NumChild=' + this.getValueOf('kids') + '&NumSenior=' + this.getValueOf('seniors');
					break;
				case 'hotels':
					u[u.length] = 'goto=HOTSEARCH' + '&CityName=' + destination + '&InDate=' + this.startDate + '&OutDate=' + this.endDate;
					u[u.length] = '&NumAdult=' + this.getValueOf('adults') + '&NumChild=' + this.getValueOf('kids');
					break;
				case 'cars':
					u[u.length] = 'goto=CARSEARCH' + '&PickUpLoc=' + origin + '&DropLoc=' + destination + '&FromDate=' + this.startDate + '&ToDate=' + this.endDate;
					u[u.length] = '&PickUpTime=' + this.startTime + '&DropTime=' + this.endTime;
					break;
				case 'cruises':
					u[u.length] = 'goto=CRUISESEARCH' + '&Destination=' + this.cruiseDestination + '&FromDate=' + this.cruiseDate;
					break;
				case 'bundles':
					if(this.bundleType == 5){
						u[u.length] = 'goto=EXPFLTWIZ' + '&FrAirport=' + origin + '&ToAirport=' + destination + '&BundType=5';
					}
					else{
						u[u.length] = 'goto=PACKAGEWIZ' + '&FrAirport=' + origin + '&DestName=' + destination + '&FromDate=' + this.startDate + '&ToDate=' + this.endDate + '&packageType=' + this.bundleType;
					}
					u[u.length] = '&FromDate=' + this.startDate + '&ToDate=' + this.endDate + '&FromTime=' + this.startTime + '&ToTime=' + this.endTime;
					u[u.length] = '&NumAdult=' + this.getValueOf('adults') + '&NumChild=' + this.getValueOf('kids') + '&NumSenior=' + this.getValueOf('seniors');
					break;
				case 'activities':
					u[u.length] = 'goto=TSHOPSSEARCH' + '&LocationName=' + destination + '&StartDate=' + this.startDate + '&EndDate=' + this.endDate;
					break;	
			}
			return u.join('');
		}
	,	setProductList:function(_productSum){
			this.productSum = (_productSum >= 1 && _productSum <= 63) ? _productSum : 63;
			for(var product in this.productList){
				if(!this.productType && (this.productList[product].bit & this.productSum)){
					this.productType = product;
				}
			}
		}
	,	setProductType:function(_productBit){
			if((_productBit >= 1 && _productBit <= 63) && !((_productBit - 1) & _productBit)){
				for(var product in this.productList){
					if(this.productList[product].bit & _productBit & this.productSum){
						this.productType = product;
					}
				}
			}
		}
	,	setCJData:function(_aid,_pid,_sid){
			this.aid = (_aid) ? _aid : '';
			this.pid = (_pid) ? _pid : '';
			this.sid = (_sid) ? _sid : '';
		}
	,	setExpeData:function(_tpid,_eapid){
			this.tpid = (_tpid) ? _tpid : '';
			this.eapid = (_eapid) ? _tpid : '';
		}
	,	setPopup:function(_popup){
			this.target = (_popup) ? "popup" : '';
		}
	,	setTarget:function(_target){
			this.target = (_target) ? (_target) : this.target;
		}
	,	bundleList:{
			2:{id:2,name:'Flight + Hotel'}
		,	5:{id:5,name:'Flight + Car',valueList:{adults:1}}
		,	1:{id:1,name:'Flight + Hotel + Car'}
		,	3:{
				id:3,name:'Hotel + Car'
			,	valueList:{adults:1}
			,	labelList:{destination:'What city?',startDate:'Check-in:',endDate:'Check-out:'}
			,	time:[
					{value:'362',text:'Any'}
				,	{value:'12AM',text:'12 AM'},{value:'1AM',text:'1 AM'},{value:'2AM',text:'2 AM'},{value:'3AM',text:'3 AM'},{value:'4AM',text:'4 AM'},{value:'5AM',text:'5 AM'},{value:'6AM',text:'6 AM'},{value:'7AM',text:'7 AM'},{value:'8AM',text:'8 AM'},{value:'9AM',text:'9 AM'},{value:'10AM',text:'10 AM'},{value:'11AM',text:'11 AM'},{value:'12AM',text:'12 AM'}
				,	{value:'12PM',text:'12 PM'},{value:'1PM',text:'1 PM'},{value:'2PM',text:'2 PM'},{value:'3PM',text:'3 PM'},{value:'4PM',text:'4 PM'},{value:'5PM',text:'5 PM'},{value:'6PM',text:'6 PM'},{value:'7PM',text:'7 PM'},{value:'8PM',text:'8 PM'},{value:'9PM',text:'9 PM'},{value:'10PM',text:'10 PM'},{value:'11PM',text:'11 PM'},{value:'12PM',text:'12 PM'}
				,	{value:'361',text:'Morn.'},{value:'721',text:'Noon'},{value:'1081',text:'Eve.'}
				]
			}
		}
	,	productList:{
			bundles:{bit:1,name:'Package'}
		,	flights:{
				bit:2,name:'Flight'
			,	valueList:{adults:1}
			,	labelList:{origin:'Leaving from:',destination:'Going to:',startDate:'Departing:',endDate:'Returning:'}
			}
		,	hotels:{
				bit:4,name:'Hotel'
			,	labelList:{destination:'What city?',startDate:'Check-in:',endDate:'Check-out:'}
			}
		,	cars:{
				bit:8,name:'Car'
			,	labelList:{origin:'What airport or city?',destination:'Drop off airport or city:',startDate:'Pick-up:',endDate:'Drop-off:'}
			,	time:[
					{value:'12AM',text:'12 AM'},{value:'1AM',text:'1 AM'},{value:'2AM',text:'2 AM'},{value:'3AM',text:'3 AM'},{value:'4AM',text:'4 AM'},{value:'5AM',text:'5 AM'},{value:'6AM',text:'6 AM'},{value:'7AM',text:'7 AM'},{value:'8AM',text:'8 AM'},{value:'9AM',text:'9 AM'},{value:'10AM',text:'10 AM'},{value:'11AM',text:'11 AM'},{value:'12AM',text:'12 AM'}
				,	{value:'12PM',text:'12 PM'},{value:'1PM',text:'1 PM'},{value:'2PM',text:'2 PM'},{value:'3PM',text:'3 PM'},{value:'4PM',text:'4 PM'},{value:'5PM',text:'5 PM'},{value:'6PM',text:'6 PM'},{value:'7PM',text:'7 PM'},{value:'8PM',text:'8 PM'},{value:'9PM',text:'9 PM'},{value:'10PM',text:'10 PM'},{value:'11PM',text:'11 PM'},{value:'12PM',text:'12 PM'}
				]
			}
		,	cruises:{
				bit:16,name:'Cruise'
			,	labelList:{destination:'Top destinations:',startDate:'Departure month:'}
			}
		,	activities:{bit:32,name:'Activities',
				labelList:{destination:'What city?',startDate:'From:',endDate:'To:'}
			}
		}
	,	labelList:{
			origin:'Leaving from:'
		,	destination:'Going to:'
		,	startDate:'Departing:'
		,	endDate:'Returning:'
		,	startTime:'Time:'
		,	endTime:'Time:'
		,	adults:'Adults:'
		,	kids:'Kids:'
		,	seniors:'Seniors:'
		,	bundleType:'Package Type:'
		,	bundlePromo:'Book together and save!'
		}
	,	valueList:{
			startDate:'mm/dd/yy'
		,	endDate:'mm/dd/yy'
		,	startTime:'11AM'
		,	endTime:'11AM'
		,	adults:2
		,	kids:0
		,	seniors:0
		}
	,	timeList:[
			{value:'362',text:'Any'}
		,	{value:'12AM',text:'12 AM'},{value:'1AM',text:'1 AM'},{value:'2AM',text:'2 AM'},{value:'3AM',text:'3 AM'},{value:'4AM',text:'4 AM'},{value:'5AM',text:'5 AM'},{value:'6AM',text:'6 AM'},{value:'7AM',text:'7 AM'},{value:'8AM',text:'8 AM'},{value:'9AM',text:'9 AM'},{value:'10AM',text:'10 AM'},{value:'11AM',text:'11 AM'},{value:'12AM',text:'12 AM'}
		,	{value:'12PM',text:'12 PM'},{value:'1PM',text:'1 PM'},{value:'2PM',text:'2 PM'},{value:'3PM',text:'3 PM'},{value:'4PM',text:'4 PM'},{value:'5PM',text:'5 PM'},{value:'6PM',text:'6 PM'},{value:'7PM',text:'7 PM'},{value:'8PM',text:'8 PM'},{value:'9PM',text:'9 PM'},{value:'10PM',text:'10 PM'},{value:'11PM',text:'11 PM'},{value:'12PM',text:'12 PM'}
		,	{value:'361',text:'Morn.'},{value:'721',text:'Noon'},{value:'1081',text:'Eve.'}
		]
	,	destinationList:[
			{id:6023184,name:'Africa'}
		,	{id:203,name:'Alaska'}
		,	{id:6050677,name:'Asia'}
		,	{id:13,name:'Bahamas'}
		,	{id:20,name:'Bermuda'}
		,	{id:6023742,name:'Canada - New England'}
		,	{id:6022969,name:'Caribbean'}
		,	{id:6023743,name:'Caribbean - Eastern'}
		,	{id:6023744,name:'Caribbean - Southern'}
		,	{id:6023745,name:'Caribbean - Western'}
		,	{id:6022967,name:'Europe'}
		,	{id:213,name:'Hawaii'}
		,	{id:3023183,name:'Mediterranean'}
		,	{id:6023750,name:'Mediterranean - Eastern'}
		,	{id:6023751,name:'Mediterranean - Western'}
		,	{id:6050655,name:'Mexico'}
		,	{id:6049796,name:'Northern Europe'}
		,	{id:-2,name:'Nowhere (no port stops)'}
		,	{id:6023753,name:'Panama Canal'}
		,	{id:6050676,name:'South America'}
		,	{id:6023738,name:'South Pacific'}
		,	{id:-3,name:'Transatlantic'}
		,	{id:-4,name:'Transpacific'}
		,	{id:6050649,name:'United States & Canada'}
		,	{id:6023746,name:'US Pacific Coast'}
		,	{id:-5,name:'World'}
		]
	,	monthList:[
			'January'
		,	'February'
		,	'March'
		,	'April'
		,	'May'
		,	'June'
		,	'July'
		,	'August'
		,	'September'
		,	'October'
		,	'November'
		,	'December'
		]
	};
	model.bundleType = 2;
	model.cruiseDate = model.getDate();
	model.cruiseDestination = 6022969;
	return model;
};expe.sf.view = {};
expe.sf.view.create = function(_model){
	return {
		m:_model
	,	container:null
	,	subList:[]
	,	render:function(_container){
			this.container = null;
			if(_container){
				this.container = _container;
				this.renderThis();
				this.renderSub();
			}
		}
	,	renderThis:function(){
			if(!this.container.innerHTML){
				this.container.innerHTML = this.getSub();
			}
		}
	,	renderSub:function(){
			for(var i = 0; i < this.subList.length; i++){
				this.subList[i].render(document.getElementById(this.container.id + '_' + i));
			}
		}
	,	addSub:function(_view){
			this.subList[this.subList.length] = _view;
		}
	,	clear:function(_view){
			this.container.innerHTML = '';
			this.container.className = 'Empty';	
		}
	,	getSub:function(){
			var s = [];
			for(var i = 0; i < this.subList.length; i++){
				s[s.length] = expe.html.div(this.container.id + '_' + i,'Empty','');
			}
			return s.join('');
		}
	,	getSubmit:function(){
			return '<input id="ExpeSf_Submit" type="image" src="https://www.ecoupons.com/show_image.php?n='+escape('http://media.expedia.com/media/content/expus/graphics/3p/common/button_green.gif') + '" class="Submit">';
		}
	,	getImpression:function(){
			return (this.m.pid && this.m.aid) ? '<img src="https://www.ecoupons.com/show_image.php?n='+escape('http://www.anrdoezrs.net/image-' + this.m.pid + '-' + this.m.aid + '') + '" height="1" width="1" />' : '';
		}
	,	getOrigin:function(_labelSum){
			var label = (_labelSum & 1) ? this.m.getLabelOf('origin') : '';
			var value = (_labelSum & 2) ? this.m.getValueOf('origin') : this.m.getRawValueOf('origin');
			var css = (_labelSum & 2) ? 'Origin Location InlineLabel' : 'Origin Location';
			var empty = (this.m.origin) ? '' : ' Empty'; 
			return expe.html.div('','origin',expe.html.textbox('ExpeSf_origin','origin',value,css + empty,label));
		}
	,	getDestination:function(_labelSum){
			var label = (_labelSum & 1) ? this.m.getLabelOf('destination') : '';
			var value = (_labelSum & 2) ? this.m.getValueOf('destination') : this.m.getRawValueOf('destination');
			var css = (_labelSum & 2) ? 'Destination Location InlineLabel' : 'Destination Location';
			var empty = (this.m.destination) ? '' : ' Empty';
			return expe.html.div('','destination',expe.html.textbox('ExpeSf_destination','destination',value,css + empty,label));
		}
	,	getStartDate:function(){
			var empty = (this.m.startDate) ? '' : ' Empty';
			var s = expe.html.textbox('ExpeSf_startDate','startDate',this.m.getValueOf('startDate'),'Start Date InlineLabel' + empty,this.m.getLabelOf('startDate'));
			return expe.html.div('','startDate',s);
		}
	,	getEndDate:function(){
			var empty = (this.m.endDate) ? '' : ' Empty';
			var s = expe.html.textbox('ExpeSf_endDate','endDate',this.m.getValueOf('endDate'),'End Date InlineLabel' + empty,this.m.getLabelOf('endDate'));
			return expe.html.div('','endDate',s);
		}
	,	getAdults:function(){
			var s = [];
			s[s.length] = expe.html.label('ExpeSf_adults','Adults',this.m.getLabelOf('adults'));
			s[s.length] = '<select id="ExpeSf_adults" name="adults" class="Adults">';
			for(var i = 0; i <= this.m.getMaxAdults(); i++){
				var selected = (i == this.m.getValueOf('adults')) ? ' selected="selected"' : '';
				s[s.length] = '<option value="' + i + '"' + selected + '>' + i + '</option>';
			}
			s[s.length] = "</select>";
			return expe.html.div('','adults',s.join(''));
		}
	,	getKids:function(){
			var s = [];
			s[s.length] = expe.html.label('ExpeSf_kids','Kids',this.m.getLabelOf('kids'));
			s[s.length] = '<select id="ExpeSf_kids" name="kids" class="Kids">';
			for(var i = 0; i <= this.m.getMaxKids(); i++){
				var selected = (i == this.m.getValueOf('kids')) ? ' selected="selected" ' : '';
				s[s.length] = '<option value="' + i + '"' + selected + '>' + i + '</option>';
			}
			s[s.length] = "</select>";
			return expe.html.div('','kids',s.join(''));
		}
	,	getSeniors:function(){
			var s = [];
			s[s.length] = expe.html.label('ExpeSf_seniors','Seniors',this.m.getLabelOf('seniors'));
			s[s.length] = '<select id="ExpeSf_seniors" name="seniors" class="Seniors">';
			for(var i = 0; i <= this.m.getMaxSeniors(); i++){
				var selected = (i == this.m.getValueOf('seniors')) ? ' selected="selected" ' : '';
				s[s.length] = '<option value="' + i + '"' + selected + '>' + i + '</option>';	
			}
			s[s.length] = "</select>";
			return expe.html.div('','seniors',s.join(''));
		}
	,	getBundleList:function(){
			var list = this.m.getBundleList();
			var s = [expe.html.label('ExpeSf_bundleType','BundleType',this.m.getLabelOf('bundleType'))];
			s[s.length] = '<select id="ExpeSf_bundleType" name="bundleType" class="BundleList">';
			for(var i in list){
				var selected = (this.m.bundleType == list[i].id) ? ' selected="selected"' : '';
				s[s.length]= '<option value="' + list[i].id + '"' + selected + '>' + list[i].name + '</option>';
			}
			s[s.length] = "</select>";
			return expe.html.div('','bundle',s.join(''));
		}
	,	getDestinationList:function(){
			var list = this.m.getDestinationList();
			var s = [expe.html.label('ExpeSf_cruiseDestination','destination',this.m.getLabelOf('destination'))];
			s[s.length] = '<select id="ExpeSf_cruiseDestination" name="cruiseDestination" class="DestinationList">';
			for(var i = 0; i < list.length; i++){
				var sSelect = (this.m.cruiseDestination == list[i].id) ? ' selected="selected"' : '';
				s[s.length] = '<option value="' + list[i].id + '"' + sSelect + '>' + list[i].name + '</option>';
			}
			s[s.length] = "</select>";
			return expe.html.div('','destination',s.join(''));
		}
	,	getMonthList:function(){
			var date = new Date();
			var month = date.getMonth();
			var year = date.getFullYear();
			var list = this.m.getMonthList();
			var s = [expe.html.label('ExpeSf_cruiseDate','month',this.m.getLabelOf('startDate'))];
			s[s.length] = '<select id="ExpeSf_cruiseDate" name="cruiseDate" class="MonthList">';
			for(var i = 0; i < this.m.getMaxCruiseMonths(); i++){
				year = ((month + i) % 12 == 0 && i > 0) ? year + 1 : year;
				var value = (i == 0) ? this.m.getDate() : ((month + i) % 12 + 1) + '/1/' + year;
				var selected = (this.m.cruiseDate == value) ? ' selected="selected"' : '';
				s[s.length] = '<option value="' + value + '"' + selected + '>' + list[(month + i) % 12] + ' ' + year + '</option>';
			}
			s[s.length] = "</select>";
			return expe.html.div('','month',s.join(''));	
		}
	,	getStartTimeList:function(){
			var s = [expe.html.label('','startTime',this.m.getLabelOf('startTime'))];
			s[s.length] = '<select id="startTime" name="startTime" class="Time">';
			var times = this.m.getTimeList();
			for(var i in times){
				var sSelect = (this.m.getValueOf('startTime') == times[i].value) ? ' selected="selected"' : '';
				s[s.length] = '<option value="' + times[i].value + '"' + sSelect + '>' + times[i].text + '</option>';
			}
			s[s.length] = "</select>";
			return expe.html.div('',"startTime",s.join(''));
		}
	,	getEndTimeList:function(){
			var s = [expe.html.label('','endTime',this.m.getLabelOf('endTime'))];
			s[s.length] = '<select id="endTime" name="endTime" class="Time">';
			var times = this.m.getTimeList();
			for(var i in times){
				var sSelect = (this.m.getValueOf('endTime') == times[i].value) ? ' selected="selected"' : '';
				s[s.length] = '<option value="' + times[i].value + '"' + sSelect + '>' + times[i].text + '</option>';
			}
			s[s.length] = "</select>";
			return expe.html.div('',"endTime",s.join(''));
		}
	,	setFocus:function(_element){
			if(!this.m[_element.name]){
				_element.value = '';
				_element.className = _element.className.replace(' Empty','');
			}
		}
	,	setBlur:function(_element){
			if(!_element.value && _element.className.indexOf('InlineLabel') > -1){
				_element.value = this.m.getValueOf(_element.name);
				_element.className += ' Empty';
			}
		}
	};
};

expe.sf.baseView = {}
expe.sf.baseView.create = function(_model){
	var v = expe.sf.view.create(_model);
	v.addSub(expe.sf.productView.create(v.m));
	v.addSub(expe.sf.bundleView.create(v.m));
	v.addSub(expe.sf.flightView.create(v.m));
	v.addSub(expe.sf.hotelView.create(v.m));
	v.addSub(expe.sf.carView.create(v.m));
	v.addSub(expe.sf.cruiseView.create(v.m));
	v.addSub(expe.sf.activityView.create(v.m));
	v.renderThis = function(){
		var s = [];
		if(!this.container.innerHTML){
			s[s.length] = expe.html.div('','headerContainer',expe.html.div('','headerLeft',expe.html.div('','headerRight',expe.html.div('','headerCenter1',expe.html.div('','headerCenter2','')))));
			s[s.length] = expe.html.div('','bodyContainer1',expe.html.div('','bodyContainer2',expe.html.div('','bodyContainer3',expe.html.div('','bodyContainer4',this.getSub()))));
			s[s.length] = expe.html.div('','bottomContainer',this.getImpression());
			this.container.innerHTML = s.join('');
			this.container.className = 'baseView';
		}
	};
	return v;		
};expe.sf.productView = {};
expe.sf.productView.create = function(_model){
	var v = expe.sf.view.create(_model);
	v.renderThis = function(){	
		if(!this.container.innerHTML){
			var s = [];
			var productList = this.m.getProductList();
			for(var i in productList){
				s[s.length] = expe.html.radio(i,'product',i,'product',productList[i].name,false);
			}
			this.container.innerHTML = s.join('');
			this.container.className = 'ProductView';
			setTimeout('document.getElementById("' + this.m.productType + '").click();',100);
		}
	};
	return v;
};

expe.sf.bundleView = {};
expe.sf.bundleView.create = function(_model){
	var v = expe.sf.view.create(_model);
	v.renderThis = function(){
		if(this.m.productType != 'bundles'){
			this.clear();
		}
		else if(!this.container.innerHTML){
			var s = [];
			s[s.length] = expe.html.div('','row nolabel',this.getOrigin(2) + this.getDestination(2));
			s[s.length] = expe.html.div('','row label',this.getStartDate() + this.getEndDate());
			s[s.length] = expe.html.div('','row submit',this.getAdults() + this.getKids() + this.getSeniors() + this.getSubmit());
			this.container.innerHTML = s.join('');
			this.container.className = 'BundleView ContentContainer';
		}
	};
	return v;
};

expe.sf.flightView = {};
expe.sf.flightView.create = function(_model){
	var v = expe.sf.view.create(_model);
	v.renderThis = function(){
		if(this.m.productType != 'flights'){
			this.clear();
		}
		else if(!this.container.innerHTML){
			var s = [];
			s[s.length] = expe.html.div('','row nolabel',this.getOrigin(2) + this.getDestination(2));
			s[s.length] = expe.html.div('','row label',this.getStartDate() + this.getEndDate());
			s[s.length] = expe.html.div('','row submit',this.getAdults() + this.getKids() + this.getSeniors() + this.getSubmit());
			this.container.innerHTML = s.join('');
			this.container.className = 'FlightView ContentContainer';
		}
	};
	return v;
};

expe.sf.hotelView = {};
expe.sf.hotelView.create = function(_model){
	var v = expe.sf.view.create(_model);
	v.renderThis = function(){
		if(this.m.productType != 'hotels'){
			this.clear();
		}
		else if(!this.container.innerHTML){
			var s = [];
			s[s.length] = expe.html.div('','row nolabel',this.getDestination(2));
			s[s.length] = expe.html.div('','row label',this.getStartDate() + this.getEndDate());
			s[s.length] = expe.html.div('','row submit',this.getAdults() + this.getKids() + this.getSubmit());
			this.container.innerHTML = s.join('');
			this.container.className = 'HotelView ContentContainer';
		}
	};
	return v;
};

expe.sf.carView = {};
expe.sf.carView.create = function(_model){
	var v = expe.sf.view.create(_model);
	v.renderThis = function(){
		if(this.m.productType != 'cars'){
			this.clear();
		}
		else if(!this.container.innerHTML){
			var s = [];
			s[s.length] = expe.html.div('','row nolabel',this.getOrigin(2) + this.getDestination(2));
			s[s.length] = expe.html.div('','row label',this.getStartDate() + this.getStartTimeList() + this.getEndDate() + this.getEndTimeList());
			s[s.length] = expe.html.div('','row submit',this.getSubmit());
			this.container.innerHTML = s.join('');
			this.container.className = 'CarView ContentContainer';
		}
	};
	return v;
};

expe.sf.cruiseView = {};
expe.sf.cruiseView.create = function(_model){
	var v = expe.sf.view.create(_model);
	v.renderThis = function(){
		if(this.m.productType != 'cruises'){
			this.clear();
		}
		else if(!this.container.innerHTML){
			var s = [];
			s[s.length] = expe.html.div('','row label',this.getDestinationList() + this.getMonthList());
			s[s.length] = expe.html.div('','row nolabel','');
			s[s.length] = expe.html.div('','row submit',this.getSubmit());
			this.container.innerHTML = s.join('');
			this.container.className = 'CruiseView ContentContainer';
		}
	};
	return v;
};

expe.sf.activityView = {};
expe.sf.activityView.create = function(_model){
	var v = expe.sf.view.create(_model);
	v.renderThis = function(){
		if(this.m.productType != 'activities'){
			this.clear();
		}
		else if(!this.container.innerHTML){
			var s = [];
			s[s.length] = expe.html.div('','row nolabel',this.getDestination(2));
			s[s.length] = expe.html.div('','row label',this.getStartDate() + this.getEndDate());
			s[s.length] = expe.html.div('','row submit',this.getSubmit());
			this.container.innerHTML = s.join('');
			this.container.className = 'ActivityView ContentContainer';
		}
	};
	return v;
};expe.sf.controller = {};
expe.sf.controller.create = function(_model,_view){
	return {
		m:_model
	,	v:_view
	,	dataContainer:null
	,	viewContainer:null
	,	initialize:function(_dataContainer,_viewContainer){
			this.dataContainer = _dataContainer;
			this.viewContainer = _viewContainer;
			this.m.loadData(this.dataContainer);
			this.v.render(this.viewContainer);
			this.bindEvents();
		}
	,	bindEvents:function(){
			this.viewContainer.onkeydown = expe.sf.c.handleKeydown;
			var inputs = this.v.container.getElementsByTagName('input');
			for(var i = 0; i < inputs.length; i++){
				inputs[i].onclick = function(){expe.sf.c.handleClick(this);};
				inputs[i].onchange = function(){expe.sf.c.handleChange(this);};
				inputs[i].onfocus = function(){expe.sf.c.handleFocus(this);};
				inputs[i].onblur = function(){expe.sf.c.handleBlur(this);};
			}
			var selects = this.v.container.getElementsByTagName('select');
			for(var i = 0; i < selects.length; i++){
				selects[i].onchange = function(){expe.sf.c.handleChange(this);};
			}
		}
	,	handleClick:function(_element){
			switch(_element.type){
				case 'radio':
					switch(_element.name){
						case 'product':
							switch(_element.value){
								case '1':case '2':case '3':case '5':
									this.m.productType = 'bundles';
									this.m.bundleType = _element.value;
									break;
								default:
									this.m.productType = _element.value;
									break;
							}
							this.m.saveData(this.dataContainer);
							this.v.render(this.viewContainer);
							this.bindEvents();
							break;						
					}
					break;
				case 'image':
					this.submit();
					break;
			}
		}
	,	handleChange:function(_element){
			switch(_element.type){
				case 'text':
					_element.value = _element.value.replace(/^\s+|\s+$/g,'');
					switch(_element.name){
						case 'origin':
						case 'destination':
						case 'startDate':
						case 'endDate':
							this.m[_element.name] = _element.value;
							this.m.saveData(this.dataContainer);
							break;
					}
					break;
				case 'select-one':
					switch(_element.name){
						case 'adults':
						case 'kids':
						case 'seniors':
						case 'cruiseDestination':
						case 'cruiseDate':
						case 'startTime':
						case 'endTime':
							this.m[_element.name] = _element.value;
							this.m.saveData(this.dataContainer);
							break;
						case 'bundleType':
							this.m[_element.name] = _element.value;
							this.m.saveData(this.dataContainer);
							this.v.render(this.viewContainer);
							this.bindEvents();
							break;
					}
					break;
			}
		}
	,	handleBlur:function(_element){
			if(_element.type == 'text'){
				_element.value = _element.value.replace(/^\s+|\s+$/g,'');
				this.m[_element.name] = _element.value;
				this.v.setBlur(_element);
			}
		}
	,	handleFocus:function(_element){
			if(_element.type == 'text'){
				this.v.setFocus(_element);
			}
		}
	,	handleKeydown:function(_event){
			var key = (_event) ? _event.which : window.event.keyCode;
			if(key == 13){
				s = document.getElementById('ExpeSf_Submit');
				s.focus();
				s.click();
			}
		}
	,	submit:function(){
			this.m.saveData(this.dataContainer);
			switch(this.m.target){
				case "popup":
					window.open(this.m.getUrl(),"ExpeWindow");
					break;
				case "parent":
					if(window.parent){
						window.parent.document.location = this.m.getUrl();
					}
					else{
						document.location = this.m.getUrl();
					}
					break;
				default:
					document.location = this.m.getUrl();
					break;
			}
		}
	};
};

expe.sf.queryString = 'pid=1242965&aid=10520150';
expe.sf.styleSheet = 'https://www.ecoupons.com/convert_script.php?n='+escape('http://www.expedia.com/pubspec/scripts/storefront/css/expe.sf.horizontal.360.css') + '';
expe.sf.initialize();