var tcr={
	prices: {
    'taxi': {day: {start: 7.5, km: 1.95}, night: {start: 7.5, km: 2.05}},
    'van': {day: {start: 10.5, km: 2.25}, night: {start: 12.2, km: 2.35}},
    'free': 2
  },
  
  tripId: 0,
	minPersons: 9,
	countryId: 'NL',

  tripTypes: {
  	'11000': 'concert',
  	'11001': 'dagje uit',
  	'11002': 'dagje uit',
  	'11003': 'groepsreis',
  	'11004': 'schoolreisje',
  	'11005': 'bedrijfsuitje',
  	'11006': 'dagje uit' 
  }
  
};

tcr.form=new Class({
		
	Implements: [Events,Options],
	
	options: {
		messageComplete: '<h2>Bericht is verzonden</h2><p>We hebben uw formulier ontvangen. Wij nemen z.s.m. contact met u op.</p>',
		directSubmit: false 
	},
	
	initialize: function(handle,options) {
		this.setOptions(options);
		this.handle=handle;
		this.form=new Form(handle,{
			onBlur: this.onChange.bind(this),
			onValid: this.onValid.bind(this),
			onInvalid: this.onInvalid.bind(this),
			onSubmit: this.onSubmit.bind(this),
			onComplete: this.onComplete.bind(this)		
		});
		this.action=this.form.action;
	},
	
	getValue: function(id) {
		return this.form.getValue(id);
	},
	
	setFocus: function(id) {
		this.form.setFocus(id);
	},
	
	onChange: function(el) {
		if (!el) return true;
		el=$(($type(el)=='string' ? el : el.id));
		if (!el) return true;
		this.fireEvent('change',[el]);
	},
	
	onValid: function(prop) {
		var id=prop.element.id+'_error';
		var el=$(id);
		if (el)
			{
			prop.element.removeClass('invalid');
			el.dispose();
			}
	},
	
	onInvalid: function(prop) {
		var id=prop.element.id+'_error';
		var el=$(id);
	  if (el)
	  	{el.set('html',prop.message);}
	  else
	  	{el=new Element('label',{id: id, 'class': 'validate', 'tween': {duration: 200}, 'opacity': 0, html: prop.message}).injectAfter(prop.element);}
		el.tween('opacity',1);
	  prop.element.addClass('invalid');
		id=prop.element.id+'_valid';
		el=$(id);
		if (el) {el.dispose();}
	},
	
	onSubmit: function() {
		if (this.options.directSubmit)
			{
			this.form.directSubmit();
			}
		else
			{
			this.form.send();
			this.fireEvent('onSubmit',this);
			}
	},
	
	onComplete: function() {
		$(this.handle).set('html',this.options.messageComplete);
		this.fireEvent('onComplete',this);
	}
	
});

tcr.route=new Class({

	Extends: wmo.fx.box,
	
	Implements: [Events,Options],

	options: {
		padding: 0,
		closeButton: false,
		resizeOnShow: false,
		title: false,
		width: 640, 
		height: 480,
		reload: false,
		adopt: 'ritplanner'
	},
		
	initialize: function() {
	
		this.geo=new wmo.geo({
			directions: true,
			onSuccess: this.onSuccess.bind(this),
			onFailure: this.onFailure.bind(this)
		});
		if (this.geo)
			{
			this.form=new Form(this.options.adopt,{
				onBlur: this.onBlur.bind(this),
				onValid: function(prop) {prop.element.removeClass('invalid').set('title','');},
				onInvalid: function(prop) {prop.element.addClass('invalid').set('title',prop.message);},
				onSubmit: this.onSubmit.bind(this)
			});
			this.parent();
			}
		$('result').set('opacity',0);		
	},
	
	onSuccess: function(result) {
		var id=result.id;
		switch (id) {
			case 'to':
			case 'from':
				var html='';
				html=(result.streetname ? (result.streetname+' '+result.streetnumber).trim()+'<br>' : '');
				html+=(result.zip ? result.zip+'  ' : '')+(result.city ? result.city : '');
				this[id+'Google']=result.location;
				$(id+'Google').set('html',html);
				this.calcRoute();
				break;
			case 'distance':	    	
	    	var distance=result.distance;
	      var html='De afstand is ongeveer <b>'+distance+' km</b>.<br>De reisduur is geschat op <b>'+result.duration+'</b>';
	      distance=distance-tcr.prices.free;
	      distance=distance<0 ? 0 : distance; 
	      var vehicle=this.form.getValue('vehicle') ? 'van' : 'taxi';
	      var moment=this.form.getValue('moment') ? 'night' : 'day';
	      var price=tcr.prices[vehicle][moment].start+(tcr.prices[vehicle][moment].km*distance);
	      $('googleDistance').set('html',html);
	      $('tcrPrice').set('text','Indicatie ritprijs: '+price.toCurrency());
	      $('result').tween('opacity',1);
				break;
		}			
	},
	
	onFailure: function(result) {
		var id=result.id;
		if (id=='distance')
			{$('result').tween('opacity',0);}
		else
			{$(id+'Google').set('html','');}
	},
	
	show: function() {
		this.parent();
		(function(){this.form.setFocus();}).delay(100,this);
	},
	
	onBlur: function(el) {
		var prefix=el.get('name').substr(0,4)=='from' ? 'from' : 'to';
		var f=this.form;
		var value='Nederland, '+f.getValue(prefix+'City')+', '+f.getValue(prefix+'Address')+' '+f.getValue(prefix+'AddressNumber');
		this.geo.findByAddress(value,prefix);
	},
	
	onSubmit: function() {
	},
	
	calcRoute: function() {
		var f=this.form;
		var fromCity=f.getValue('fromCity').trim().length!=0;
		var toCity=f.getValue('toCity').trim().length!=0;	
		if (fromCity && toCity && this.fromGoogle && this.toGoogle)
	    {this.geo.getDistance(this.fromGoogle,this.toGoogle,'distance');}
		else
			{$('result').tween('opacity',0);}	
	}	
	
});

tcr.tours={};
tcr.tours=new Class({

	initialize: function(url) {
	
		if ($('teaser'))
			{this.setTeaser();}
		this.handle='search';
		var form=$(this.handle);
		form.set('autocomplete','off');
		this.value=null;
		$('reset').addEvent('click',this.reset.bind(this));
		form.getElements('input[type=text]').addEvent('keydown',this.onChange.bind(this));
		new wmo.fx.labelLess('input[name=searchFor]');
		if ($('form_offerte'))
			{this.form=new tcr.tours.form();}
		if ($('signup'))
			{
			this.signup=new tcr.form('signup',{onChange: this.onChange.bind(this), onSubmit: this.signedUp.bind(this), directSubmit: true});
			
			$('signup').set('action',(this.signup.action+this.signup.getValue('TYPE')));
			this.signup.setFocus();
			}		
	},
	
	setTeaser: function() {
		var ul=$('text');
		if (ul)
			{
			var timeout=null;
			$('teaser').addEvents({
				'mouseleave':function(e){
				tcr.slide.resume();
				if (timeout!=null) {clearTimeout(timeout);}
				}
			});
			
			ul.getElements('a').addEvents({
				'mouseenter': function(e) {
					var el=e.target;
					var el=(el.tagName.toUpperCase()=='LI' ? $(el).getElement('a') : $(el));
					if (timeout!=null) {clearTimeout(timeout);}
					timeout=(function(){
						ul.getElements('.active').removeClass('active');
						el.addClass('active');
						var id=parseInt(el.get('class').substr(1,1))-1;
						tcr.slide.stop();
						tcr.slide.slide(id);
						timeout=null;
					}).delay(400);
				},
				'mouseleave': function(e) {
					//ul.getElements('.active').removeClass('active');
				}
			});
		}
	},
	
	show: function() {
		this.form.show();
	},
	
	reset: function() {
		var el=$(this.handle).getElement('input[name=searchFor]');
		el.set('value','').focus();
		$('reset').display();		
	},
		
	onChange: function(e) {
		var el=$type(e)=='element' ? e : $(e.target);
		switch (el.id) {
			case 'TYPE':
				$('signup').set('action',this.signup.action+el.value);
				//$('signup').set('send',{method: 'get', url: (this.signup.action+el.value)});
				break;
			case 'searchFor':
				var value=el.value.trim();
				$('reset').setStyle('display',value.length==0 ? 'none' : 'block');
				break;
			}
	},
	
	signedUp: function() {
		var html='<p>We hebben uw aanmelding ontvangen.</p>';
		html+='<p>U ontvangt nog een e-mail waarmee u de aanmelding kunt bevestigen.</p>';
		html+='<p>Team TCR Tours</p>';
		$('signup').set('html',html);
	}
		
});

tcr.tours.form=new Class({

	Extends: wmo.fx.box,
	
	Implements: [Events,Options],

	options: {
		padding: 0,
		closeButton: {visible: true, offsetX: 12, offsetY: 0},
		resizeOnShow: false,
		title: false,
		width: 640, 
		height: 480,
		reload: false,
		adopt: 'form_offerte'
	},
		
	initialize: function() {
		this.tripId=tcr.tripId ? tcr.tripId : 0;
		this.handle=$(this.options.adopt);
		if (this.handle)
			{
			this.handle.getElements('.notrip').setClass(this.tripId!=0,'hidden');
			this.wizard=new wmo.fx.wizard({
				selector: {container: this.options.adopt},
				beforeNext: this.beforeNext.bind(this),			
				beforePrevious: function(step){return step+1;},
				onAfterNext: this.onAfterStep.bind(this),
				onAfterPrevious: this.onAfterStep.bind(this)
			});		
			this.parent();
			//this.geo=new wmo.geo({
			//	onSuccess: this.onSuccess.bind(this),
			//	onFailure: this.onFailure.bind(this)
			//});
			this.form=new Form(this.handle,{
				calendar: '.wmoCalendar',
				onBlur: this.onBlur.bind(this),
				onValid: function(prop) {prop.element.removeClass('invalid').set('title','');},
				onInvalid: function(prop) {prop.element.addClass('invalid').set('title',prop.message);},
				onSubmit: this.onSubmit.bind(this),
				onComplete: this.onComplete.bind(this)
			});
			this.form.setRule('Persons',{minValue: tcr.minPersons});
			this.tripType=this.form.getValue('To_Type');
			this.isForeign=tcr.countryId!='NL';
			//$('result').set('opacity',0);		
		}
	},
	
	show: function() {
		this.wizard.setStep(0);
		this.parent();
		(function(){this.form.setFocus();}).delay(100,this);
		return false;
	},
	
	beforeNext: function(step) {
		var f=this.form;
		var invalidId=false;
		
		$(this.wizard.selected).getElements('input').each(function(el){
			if (invalidId==false && !f.validate(el))
				{invalidId=el.id;}
		});
		if (invalidId) 
			{
			this.form.setFocus(invalidId);
			return false;
			}
		if (step==(this.wizard.maxStep-1))
			{
			if (this.form.validateForm())
				{this.form.send();}
			else
				{return false;}
			}
		else if (step==0 && (this.tripType==11000 || this.tripType==11006))
			{
			var persons=this.form.getValue('Persons').toNumber();
			if (persons>1 && this.isForeign)
				{
				var i=1;
				this.form.getElements('tr.passenger').each(function(el){
					i++;
					el.setClass(i>persons,'hidden');
				});
				}
			else
				{step++;}
			}
		return (step+1);
	},
	
	onComplete: function(response) {
	},
	
	onAfterStep: function(step) {
		var max=this.wizard.maxStep;
		this.wizard.button.previous.setClass((step==0 || step==max),'hidden');
		this.wizard.button.next.setClass(step>(max-1),'hidden')
		this.wizard.button.next.setClass(step==(max-1),'send');
		switch (step) {
			case 0:
				//this.form.setFocus('FromZipcode');
				this.form.setFocus('FromCity');
				break;
			case 1:
				this.form.setFocus('Title');
				break;
		}
	},
	
	onBlur: function(el) {
		var id=el ? ($type(el)=='string' ? el : el.id) : false;
		if (id)
			{
			var data=this.form.getValue(['FromCity','ToCity','To_Title','DepartureDate','DepartureTime','ReturnDate','ReturnTime','Persons','Tickets','Wheelchairs','BankAccount']);
			switch (id) {
				case 'DepartureDate':
					//var value=el.getValue();
					//var rel=el.getOption().get('rel').split(';');
					//var ticket=rel[1];
					//$('TicketPrice').set('text',ticket.toDecimal());
					break;
				case 'Persons':					
					var value=el.getValue();
					if (this.form.original!=value)
						{
						data.Tickets=0;
						this.form.setValue('Tickets',0);
						this._showBoardings(true,value);
						}
					this.form.setRule('Tickets',{maxValue: value});
					break;
				case 'BoardingPersons[0]':
				case 'BoardingPersons[1]':
				case 'BoardingPersons[2]':
				case 'BoardingPersons[3]':
				case 'BoardingPersons[4]':
				case 'BoardingPersons[5]':
					this._showBoardings(false,data.Persons);
					break;
			}
			var html=(this.tripType==11000 || this.tripType==11006) ? this.summaryReservation(data) : this.summaryProposal(id,data);
			var remarks=this.form.getElement('textarea[name=Remarks]');
			if (remarks && remarks.value.trim().length>0)
				{
				remarks=remarks.value.trim().replace(/\n\r?/g, '<br>');
				html+='<h3>Uw opmerkingen:</h3><p class="message">'+remarks+'</p>';
				}
			$('Data').set('html',html);
			}
	},

	_showBoardings: function(reset,persons) {
		var i=-1;
		var id;
		var counter=0;
		var rest=persons;
		var value;
		var hide=true;
		var f=this.form;
		f.getElements('tr.boardings').each(function(el){
			i++;
			id=el.getElement('input').get('id');
			value=f.getNumber(id);
			
			counter=counter+value;
			if (reset && i==0)
				{
				hide=false;
				f.setRule(id,{maxValue: persons});
				f.setValue(id,persons);
				}
			else if (rest!=0 && !reset)
				{
				hide=false;
				f.setRule(id,{maxValue: rest});
				if (value==0 || (rest-value<0))
					{
					f.setValue(id,rest);
					rest=0;
					}
				else
					{rest=rest-value;}			
				}
			if (hide)
				{f.setValue(id,0);}
			el.setClass(hide,'hidden');
			hide=true;
		});
	
	},
	
	summaryProposal: function(id,data) {
		if (id=='DepartureDate') 
			{
			this.form.setRule('ReturnDate',{defaultValue: data.DepartureDate, minValue: data.DepartureDate});
			if ($validate.dateValue(data.DepartureDate)>$validate.dateValue(data.ReturnDate))
				{
				this.form.setValue('ReturnDate',data.DepartureDate);
				data.ReturnDate=data.DepartureDate;
				}
			}
		var html='<h3>Uw aanvraag:</h3>';
		//if (!this.form.getElement('input[name=FromZipcode]').hasClass('invalid'))
		if (!this.form.getElement('input[name=FromCity]').hasClass('invalid'))
			{
			//var street=data.FromStreetName;
			//if (street)
			//	{
			//	var prefix=(street.test(/(de|het|\'t)/i) ? '' : (street.test(/plein$/i) ? 'het ': 'de '));
			//	html+='<p>U vertrekt uit <b>'+data.FromCity+'</b> vanaf '+prefix+'<b>'+data.FromStreetName+' '+data.FromStreetNumber+'</b>';
			//	}
			html+='<p>U vertrekt vanuit <b>'+data.FromCity+'</b>';
			}
		if (data.To_Title && this.tripId!=0)
			{
			data.To_Title=data.To_Title.replace(/\"/,'\'');
			html+='.</p><p>U wilt een offerte voor:<br><b>'+data.To_Title+'</b><br>';
			}					
		if (this.form.validate('DepartureDate'))
			{
			var d=data.DepartureDate.dateSerial();
			html+=' op '+days.name[d.weekday]+' <b>'+d.day+' '+months.name[d.month]+'</b> '+d.year;
			}
		if (this.tripId==0 && this.form.validate('DepartureTime'))
			{html+=' om <b>'+data.DepartureTime+'</b> uur';}
		//if (this.tripId==0 && !this.form.getElement('input[name=ToZipcode]').hasClass('invalid'))
		if (this.tripId==0 && !this.form.getElement('input[name=ToCity]').hasClass('invalid'))
			{
			//var street=data.ToStreetName;
			//if (street)
			//	{
			//	var prefix=(street.test(/(de|het|\'t)/i) ? '' : (street.test(/plein$/i) ? 'het ': 'de '));
			//	html+='<p>U wilt naar '+prefix+'<b>'+data.ToStreetName+' '+data.ToStreetNumber+'</b> in <b>'+data.ToCity+'</b>';
			//	}
			html+='<p>U wilt naar <b>'+data.ToCity+'</b>';
			}
		html+='.</p>';
		if (this.form.validate('Persons'))
			{
			html+='<p>U gaat met <b>'+data.Persons+'</b> personen';
			if (data.Wheelchairs && this.form.validate('Wheelchairs'))
				{
				var value=data.Wheelchairs.toInt();
				html+=(value>0 ? ' (waarvan '+value+' in een rolstoel)': '');
				}
			html+='.</p>';
			}
		if (this.tripId==0 && this.form.validate('ReturnDate'))
			{
			var d=data.ReturnDate.dateSerial();				
			html+='<p>'+(data.DepartureDate==data.ReturnDate ? 'Om ' : 'Op '+days.name[d.weekday]+' <b>'+d.day+' '+months.name[d.month]+'</b> '+d.year+' om ')+' <b>'+data.ReturnTime+'</b> uur wilt u weer thuis zijn.</p>';
			}
		return html;
	},
	
	summaryReservation: function(data) {
		var html='<h3>Uw reservering:</h3>';
		var el=this.form.getElement('select[name=DepartureDate]');
		var persons=data.Persons.toNumber();
		var tickets=data.Tickets ? data.Tickets.toNumber() : 0;
		var rel=el.getOption().get('rel').split(';');
		var price=rel[0];
		var ticket=rel[1];
		var prices=tickets ? '<br>('+(persons-tickets)+'x '+price.toCurrency()+' en '+tickets+'x alleen vervoer '+ticket.toCurrency()+')' : '';
		price=price ? price.toFloat()*(persons-tickets) : 0;
		var ticket=tickets ? ticket.toFloat()*tickets : 0;
		price=price+ticket;
		var date=el.getOptionText();
		var boarding=this.form.getElement('select[name=BoardingPlace[0]]').getOptionText();
		var i=boarding.indexOf('|');
		var time=boarding.substr(0,i-1);
		boarding=boarding.substr(i+1);
		html+='<p>'+(this.tripType=='11000' ? 'U gaat naar het concert:' : 'U gaat mee met de dagtocht:')+'<br><b>'+data.To_Title+'</b></p>';
		html+='<p>U vertrekt op <b>'+date+'</b> vanuit <b>'+boarding+'</b> om <b>'+time+'</b> uur.</p>';
		if (persons>0)
			{
			html+='<p>U gaat met <b>'+persons+'</b> '+(persons==1 ? 'persoon' : 'personen')+'. Het totaalbedrag is <b>'+price.toCurrency()+'</b>'+prices+'.</p>';
			if (data.BankAccount.length>0)
				{
				if (data.BankAccount.substr(0,1)=='p')
					{
					var bankType='giro';
					data.BankAccount=data.BankAccount.substr(1);
					}
				else
					{var bankType='bank';}
				html+='<p>U geeft ons toestemming* het bedrag af te schrijven van '+bankType+'rekening <b>'+data.BankAccount+'</b>.';
				html+='<p style="font-size: 11px;">*)<i> Afschrijving vindt plaats bij voldoende deelname en uiterlijk 2 dagen voor vertrek.</i></p>';
				}
			}
		return html;
	},
	
	onSubmit: function() {
	}
			
});

tcr.site=new Class({
		
	initialize: function(hasVideo) {
		this.footer=$('footer');
		this.content=$('content');
		this.window=$(window);
		window.addEvent('resize',this.resize.bind(this));
		this.windowHeight=0;
		this.footerHeight=$('footer').getSize().y+20;
		this.resize();
		this.setMenu();
		if ($('ritplanner')) {this.route=new tcr.route();}
		if ($('search'))
			{this.tours=new tcr.tours();}
		tcr.slide=new wmo.fx.simpleSlide('.foto',{
			startSlideOnInitialize: !hasVideo, 
			fxDuration: 500, 
			periodical: 5000, 
			onComplete: function(response){
				var ul=$('text');
				if (ul)
					{
					ul.getElements('.active').removeClass('active');
					ul.getElement('a.t'+response.counter).addClass('active');
					}
				}
			});
	},

	resize: function() {
		var ws=this.window.getSize();
		//$('gradient').setStyles({width: ws.x, height: ws.y});
		//if (this.windowHeight!=ws.y)
		//	{
			this.windowHeight=ws.y;
			var cc=this.content.getCoordinates();
			//var fc={y: 160};//footer.getSize();
			this.footer.setStyle('position',(ws.y-(this.footerHeight+cc.bottom)>0) ? 'fixed' : 'relative');
			//var fc=this.footer.getCoordinates();
			//footer.set({styles: {height: (ws.y<160 ? 160 : ws.y)-cc.bottom-14}});
		//	}
	},
	
	setMenu: function() {
		var menu=$('menu');
		var active='';
		//menu.getElements('ul.submenu').set('opacity',0.9);
		menu.getElements('ul li.main').addEvents({
			'mouseenter': function(e) {
				var el=$(e.target);
				var tag=el.get('tag');
				var el=(tag=='li' ? el.getElement('a') : tag=='span' ? el.getParent() : el);
				el=el.addClass('active').getNext();
				if (el)
					{el.addClass('active');}
			},
			'mouseleave': function(e) {
				menu.getElements('.active').removeClass('active');
			}
		});
	}
		
});

wmo.fx.labelLess=new Class({

	Implements: [Events, Options],
	
	options: {
		type: 'apples'
	},
	
	initialize: function(selector,options) {
		this.setOptions(options);
		options=this.options;
		$$(selector).each(function(el) {
			el.set({'value': el.get('alt'), 'events': {
				'click': this._start.bindWithEvent(this), 
				'focus': this._start.bindWithEvent(this),
				'blur': function() 
					{if (el.get('value').trim().length==0 || el.get('value')==el.get('alt')) {el.set({'value': el.get('alt')});el.removeClass('focus');}},
				'keydown': function(e) {
					if ((e.key=='backspace' || e.key=='delete') && options.type=='apple')
						{
						var l=el.value.length;
						if (l==1 || (l==($getSelectionEnd(el)-$getSelectionStart(el))))
							{
							e.stop();
							el.set('value',el.get('alt'));
							el.addClass('focus');
							$setCaretTo(el,0);
							}						
						}
					},				
				'keypress': function(e)
					{
					var value=el.value;
					var alt=el.get('alt');
					var first=e.key;//;value.substring(0,1);
					if (value==alt && first.length==1)
						{
						e.stop();
						el.set('value',(e.shift ? first.toUpperCase() : first));
						el.removeClass('focus');
						}
					}
			}});
		},this);
		
	},
	
	_start: function(e) {
		e.stop();
		var el=$(e.target);
		if (el.get('value')==el.get('alt')) 
			{
			if (this.options.type=='apple')
				{$setCaretTo(el,0);}
			else
				{el.set('value','');}
			el.addClass('focus');	
			}
		else
			{el.selectRange(0,el.value.length);}
	}
	
});

if (hasVideo==undefined)
	{var hasVideo=false;}
window.addEvent('domready',function(){
	tcr.site=new tcr.site(hasVideo);
});//, 'resize': tcr.site.resize.bind(tcr.site.resize)});

