var FlightSearch = new Class({	
	
	Implements : [Options, Events],
	
	options : {
		baseUrl	: '',
		url		: '/index/getresults',
		startSearchUrl: '/index/startsearch',
		otaNames: [],
		targetContainer : 'result-points',
		searchingContainer: 'searching',
		searchingContainerOtaName : 'otaName',
		searchQueryId : '',
		searchFilterId : '',
		perodicalTime: 2000,
		animationTime: 1000
	},
	
	isSearching : false,
	searchingContainer : false,
	searchingContainerOtaName : false,
	targetContainer : null,
	otaCnt : 0,
	
	initialize : function(options)
	{
		
		this.setOptions(options);
		
		if($(this.options.searchingContainer))
			this.searchingContainer = $(this.options.searchingContainer);
		
		if($(this.options.searchingContainerOtaName))
			this.searchingContainerOtaName = $(this.options.searchingContainerOtaName);
		
		if($(this.options.targetContainer))
			this.targetContainer = $(this.options.targetContainer);
		
	},
	
	getResultHTML : function(flight,key)
	{
		var html = '<li><div class="top"></div>'+
   						'<a class="bprice" href="'+this.options.baseUrl+flight.url+'" target="_blank"><span class="price1">'+flight.priceFormatted+'</span> buchen</a>'+
   						'<div class="boxtext">'+
   							'<ul class="data">'+
   								'<li class="date">'+flight.outboundFlight.departureDateFormatted+'</li>'+
   								'<li class="time">'+flight.outboundFlight.departureTime+' - '+flight.outboundFlight.arriveTime+'</li>'+
   								'<li class="tim2">'+flight.outboundFlight.durationFormatted+'</li>'+
   								'<li class="place">'+flight.outboundFlight.departureNameFormatted+' - '+flight.outboundFlight.arriveNameFormatted+'</li>'+
   								'<li class="lines">'+flight.outboundFlight.parts[0].airlineName+'</li>'+
   								'<li>'+flight.outboundFlight.stops+'</li>'+
   							'</ul>';
		
		if(!flight.oneWay)
			html +=  '<ul class="data lastul">'+
   						'<li class="date">'+flight.inboundFlight.departureDateFormatted+'</li>'+
   						'<li class="time">'+flight.inboundFlight.departureTime+' - '+flight.inboundFlight.arriveTime+'</li>'+
   						'<li class="tim2">'+flight.inboundFlight.durationFormatted+'</li>'+
   						'<li class="place">'+flight.inboundFlight.departureNameFormatted+' - '+flight.inboundFlight.arriveNameFormatted+'</li>'+
   						'<li class="lines">'+flight.inboundFlight.parts[0].airlineName+'</li>'+
   						'<li class="stops">'+flight.inboundFlight.stops+'</li>'+
   					 '</ul>';
		
		html += '<ul class="booking"><li class="first">Buchen bei:</li>';
		flight.alternative.each(function(alternative,key){
			var lastClass = '';
			if(key+1 == flight.alternative.length)
				lastClass = 'last';
			
			html +='<li class="'+lastClass+'"><a href="'+this.options.baseUrl+alternative.url+'"  target="_blank">'+alternative.otaName+' ('+alternative.priceFormatted	+')</a> </li>';
			
		}.bind(this));
		html +=		'</ul>'+
			 		'</div>'+
			 	'<div class="bottom"></div>'+
			 '</li>';
		
		return html;
	},
	
	updateResults : function(flights)
	{
		var resultsHTML = '';
		$each(flights, function(flight,key){
			resultsHTML += this.getResultHTML(flight,key);
		}.bind(this));
		this.targetContainer.set('html',resultsHTML);
	},
	
	startSearch : function()
	{
		this.isSearching = true;
		this.searchAnimation();
		
		new Request.JSON({
			url: this.options.baseUrl+this.options.startSearchUrl,
			data: {
				'searchQueryId':this.options.searchQueryId,
				'searchFilterId': this.options.searchFilterId},
			method:'get',
			onSuccess: function(json){
				if(json.success)
				{
					this.filterId = json.filterId;
					this.getResults();
				}
				else
				{
					this.searchingComplete();
					this.targetContainer.set('html',json.message);
				}
				
			}.bind(this)}).get();
		
	},
	
	getResults : function()
	{
		new Request.JSON({
			url: this.options.baseUrl+this.options.url,
			data: {
				'searchQueryId':this.options.searchQueryId,
				'searchFilterId':this.options.searchFilterId
			},
			method:'get',
			onSuccess: function(flights){
				
				if(flights.flights && flights.flights.length>0)
					this.updateResults(flights.flights);	
				
				if(flights.status == 0)
				{
					this.getResults.delay(this.options.perodicalTime,this);
				}
				else
				{
					this.searchingComplete();
					if(!flights.flights || flights.flights.length==0)
						this.targetContainer.set('html',flights.message);
				}
				
				this.fireEvent('onUpdateResults', [flights, this]);
			
			}.bind(this)}).get();
	},
	
	searchAnimation : function()
	{
		if(this.isSearching==false)
			return;
		
		if(this.otaCnt==this.options.otaNames.length)
			this.otaCnt = 0;
		
		this.updateSearchingContainerOtaName(this.options.otaNames[this.otaCnt]);
		this.otaCnt++;
		this.searchAnimation.delay(this.options.animationTime,this);
	},
	
	updateSearchingContainerOtaName : function(otaName)
	{
		if(this.searchingContainerOtaName)
			this.searchingContainerOtaName.set('text',otaName);
	},
	
	searchingComplete : function()
	{
		this.isSearching = false;
		if($(this.options.searchingContainer))
			(new Fx.Reveal(this.options.searchingContainer)).dissolve();
	}
	
});
