"use strict";
jQuery(function($){
	(function flightSearch(){
		(function design(){
			var iatasFields = $('[name="from_iatas-proxy"], [name="to_iatas-proxy"]').autocomplete({
				source: function( request, response ) {
					var input = $( this.element )

					$.ajax({
						url: '/',
						dataType: 'json',
						data: {
							page: 'getairports',
							search: request.term,
							locale: window.currentLanguage
						},
						
						success: function( data ) {

							var source = {};
							$.each( data, function( i, item ) {
								var city = typeof item.city  === 'object' ? item.city[0] : item.city;
									if(!source[city]) {
									source[city] = [];
								}
								
								source[city].push({
									city 		: city,
									iata 		: typeof item.iata 		 === 'object' ? item.iata[0] 		: item.iata,
									country		: typeof item.country 	 === 'object' ? item.country[0] 	: item.country,
									countryiso	: typeof item.countryiso === 'object' ? item.countryiso[0]  : item.countryiso,
									airname 	: typeof item.airname 	 === 'object' ? item.airname[0] 	: item.airname
								});									
							});
							
							
							var result = [];
							$.map( source, function( item, city ) {
								
								if(item.length -1) {
									result.push({
										label: city + ' (all)',
										value: city + ' (all)',
										iatas: $.map(item, function(airport){
											return airport.iata;
										}).join('-')
									});
									
									$.each(item, function(i, airport){
										result.push({
											label: ' → ' + airport.airname + ' ('+airport.iata+')',
											value: airport.airname + ' ('+airport.iata+')',
											iatas: airport.iata
										});
									});
									
								} else {
									result.push({
										label: item[0].airname + ' ('+item[0].iata+')',
										value: item[0].airname + ' ('+item[0].iata+')',
										iatas: item[0].iata
									});
								}
							});
							
							if( result.length ) {
								input.data('first-item', {
									iatas: result[0].iatas,
									label: result[0].label,
								});
							}
							
							response( result );
				
							
						}
					});
				},
				
				minLength: 3,
				select: function( event, ui ) {
					var self = $( this ),
						name = self.attr( 'name' ).replace( '-proxy', '' );

					self.next( '[name="$1"]'.replace( '$1', name ) ).val( ui.item.iatas );
				},
				
				open: function() {
					//$( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" );
				},
				
				close: function( event, ui ) {
					var name, firstItem, $this = $(this);
					if( event.target === this ) {
						firstItem = $this.data( 'first-item' );
						name = this.name.replace('-proxy', '');
						if( firstItem ) {
							$this.val( firstItem.label );
							$this.next( '[name="$1"]'.replace( '$1', name ) ).val( firstItem.iatas );
						}
					}
					
					
					//basar.log( $( event.target ).data(), ui )
					//basar.log( event.currentTarget );
					//$( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" );
				}
			});
			
			$('[name="departure_date-proxy"], [name="return_date-proxy"]').datepicker({
				minDate: 1,
				maxDate: "+10M",
				dateFormat: 'dd.mm.yy',
				onSelect: function(dateText, inst) { 
					var self = $(this),
						name = self.attr('name').replace('-proxy', '');

					self.next('[name="$1"]'.replace('$1', name)).val(
							$.datepicker.formatDate('yy-mm-dd',
								new Date(inst.selectedYear, inst.selectedMonth, inst.selectedDay))
						);
				}
			});
			
			$('a.checkbox').click(function(){
				var self = $(this),
					data = self.data(),
					dataFor = data['for'],
					value1 = data.value1,
					value2 = data.value2,
					forField = $('[name="$1"]'.replace('$1', dataFor));
				
				self.toggleClass('checked');
				if(!self.hasClass('checked')) {
					forField.val(value1);
				} else {
					forField.val(value2);
				}
			});
			
		})();
		
		(function main() {
			var langArray = window.langArray,
				basar = {
				numberOfAjaxQuerys: 8,
				minAjaxDelay: 0,
				ajaxTimeOutId: null,
				currentPage: 0,
				itemsPerPage: 10,
				form: document.getElementsByName( 'basarform' )[0],
				formData: null,
				responseData: null,
				ajax: null,
				responseBody: $( 'table.response-content > tbody' ),
				paginationContainer: $( '.pagination' ),
				getFormData: function(){
					basar.formData = {
						from_iatas: basar.form.from_iatas.value,
						to_iatas: basar.form.to_iatas.value,
						departure_date: basar.form.departure_date.value,
						return_date: basar.form.return_date.value,
						adults: basar.form.adults.value,
						children: basar.form.children.value,
						infants: basar.form.infants.value,
						nonstop: basar.form.nonstop.value,
						oneway: basar.form.oneway.value,
						//flexible: basar.form.flexible.value,
						
						page: 'search',
						locale: window.currentLanguage						
					}
				
					if( +basar.formData.oneway ) {
						delete basar.formData.return_date;
					}
					
					return basar.formData;
				},
				
				validateForm: function() {
					var valid = true;
					if( !basar.form.from_iatas.value || !basar.form['from_iatas-proxy'].value ) {
						$( basar.form['from_iatas-proxy'] ).addClass( 'invalid' );
						valid = false;
					}
					
					if( !basar.form.to_iatas.value || !basar.form['to_iatas-proxy'].value ) {
						$( basar.form['to_iatas-proxy'] ).addClass( 'invalid' );
						valid = false;
					}
					
					if( !basar.form.departure_date.value || !basar.form['departure_date-proxy'].value ) {
						$( basar.form['departure_date-proxy'] ).addClass( 'invalid' );
						valid = false;
					}
					
					if( ( !basar.form.return_date.value || !basar.form['return_date-proxy'].value ) && !+basar.form.oneway.value ) {
						$( basar.form['return_date-proxy'] ).addClass( 'invalid' );
						valid = false;
					}
					
				
					return valid;
				},
				
				validateResponse: function( data, url ){
					try {
						basar.responseData = JSON.parse( data );
						if( typeof basar.responseData === 'number' ) {
							basar.responseData = [];
						}
					} catch ( e ) {
						/*$('table.response-content > tbody').empty();
						$('.error').show();
						$('.empty').hide();
						$('.progressbar div').progressbar( 'destroy' );*/
						basar.notice( langArray.parse_error, {
							error: e,
							url: url
						});
						return false;
					}
					
					/*if( +basar.form.nonstop.value ) {	
						basar.responseData = basar.responseData.filter( function( item, i ){
							return !!!( +item.outboundFlight[0].stops[0] || item.returnFlight[0] && +item.returnFlight[0].stops[0] )  
						});
					}*/
					
					if( !basar.responseData.length ) {
						basar.notice( langArray.responce_is_empty );
						return false;
					}			
					
					return basar.responseData.sort(function( a, b ){
						return a.price[0] - b.price[0];
					});
				},
				
				registerHandlers: function(){
					$( 'input' ).focus( function(){
						$(this).removeClass( 'invalid' );
					});
					$( basar.form ).submit( function( event ){
						$( '.progressbar-container .logo-carousel .carousel-progressbar' ).agCarousel( 'destroy' );
						basar.ajax && basar.ajax.abort();
						basar.currentPage = 0;
						basar.responseBody.empty();
						basar.paginationContainer.empty();
						basar.request(); 
						return false;
					});
					
					$( document ).mouseover( function( event ){ //basar.log( 'mouseover' )
						if( $( event.target ).closest( '.result-group-hidden-box' ).size() || $( event.target ).is( '.next-step' )) {
							$( event.target ).closest( 'td' ).find( '.result-group-hidden-box' ).show();
						} else {
							$( '.result-group-hidden-box' ).hide();
						}
					});
				},
				
				generatePage: function( ){
					basar.responseBody.empty();
										
					$( '#response-template' )
						.tmpl( basar.responseData.slice( basar.currentPage * basar.itemsPerPage, ( basar.currentPage + 1 ) *  basar.itemsPerPage ), {
								formatDate: function( date ){
									return $.datepicker.formatDate( 'dd.mm.yy', $.datepicker.parseDate( 'yy-mm-dd', date  ) );
								},
								formatDuration: function( duration ){
									var hours = Math.floor(duration/60),
										minutes = duration % 60;
									
									if(minutes < 10) {
										minutes = '0' + minutes;
									}
								
									return hours + ':' + minutes;
								}
							}).appendTo( basar.responseBody )
							 .find('img.airline-logo').error(function(){
								basar.log('Logo unexist', this.src);
								this.src = 'images/airlines/unexist.png';
							 });
							
					basar.paginate( basar.currentPage );
				},
				
				request: function( number ){
					number = number || 0;
					if( basar.validateForm() ) {
					
						$('.response').show();
						
						basar.notice( null );
					
						basar.progressBar( number*100/basar.numberOfAjaxQuerys );
						
						basar.ajax = $.ajax({
							url: '/',
							dataType: 'text',
							method: 'GET',
							data: basar.getFormData(),
							error: function(){
								basar.notice( langArray.ajax_error, this, arguments );
							},
							success: function( data ) {
								
								basar.success( data );

								if( number < basar.numberOfAjaxQuerys && data !== JSON.stringify( basar.formData ) ) {
									if( !basar.ajaxTimeOutId ) {
												
										basar.ajaxTimeOutId = setTimeout(function(){
											basar.ajaxTimeOutId = null;

										}, basar.minAjaxDelay);
										
										basar.request( ++number );
									} else {
										clearTimeout( basar.ajaxTimeOutId );
										basar.ajaxTimeOutId = setTimeout(function(){
											basar.ajaxTimeOutId = null;
											basar.request( ++number );											
										}, basar.minAjaxDelay);
									}
								} else {
									basar.progressBar( null );
								}
							}
						});
					}
				},
				
				success: function( data ) {
					basar.validateResponse( data, this.url ); 
					basar.log( basar.responseData )
					if( !basar.responseData ) {
						return false;
					}
					
					basar.groupAndSortData( basar.responseData, function( data ) {
						basar.responseData = data;
						basar.generatePage( basar.currentPage );
					});
				},
				
				groupAndSortData: function( data, callback ){
					var worker = new Worker( 'js/group-and-sort-response-data.js' );
					
					worker.postMessage( data );
					
					worker.onmessage = function( event ) {
						callback( event.data );
					}
					
				},
				
				notice: function( text ) {
					if( text ) {
						console && console.log( 'Notice', arguments );
						$( '.notice' ).html( text );
					} else {
						$( '.notice' ).empty();
					}
				},
				
				log: function( text ) {
					console && console.log( text, arguments );
				},
				
				progressBar: function( value ) {
					$( '.progressbar' ).progressbar( 'destroy' );
					
					if( value !== null ) {
						$( '.progressbar' ).progressbar({
							value: value || 5
						});
						
						!value && $( '.progressbar-container .logo-carousel .carousel-progressbar' ).agCarousel();
					} else {
						$( '.progressbar-container .logo-carousel .carousel-progressbar' ).agCarousel( 'destroy' );
					}
				},
				
				paginate: function(  ) {
					
					var pagesCount = parseInt( basar.responseData.length/basar.itemsPerPage ),
						createLink = function( text, page ) {
						return $('<a />', {
									'class': 'page-number',
									href: '#'
								 })
								 .text( text )
								 .click(function(){
									basar.currentPage = page;
									basar.generatePage( page );
									return false;
								 });
						}
					
					basar.paginationContainer.empty();
					
					basar.currentPage = basar.currentPage <= pagesCount ? basar.currentPage : pagesCount
					
					
					basar.paginationContainer.append( createLink( '←', basar.currentPage ? basar.currentPage - 1 : basar.currentPage ) );
					for(var i = -6; i < 7; i++) {
						if( basar.currentPage + i >= 0 && basar.currentPage + i <= pagesCount) {
							basar.paginationContainer.append( createLink( i + basar.currentPage + 1, i + basar.currentPage ).addClass( i===0 ? 'current' : '' ) );
						}
					}
					basar.paginationContainer.append( createLink( '→', basar.currentPage < pagesCount ?  basar.currentPage + 1 : basar.currentPage ) );
				}
			}
			
			basar.registerHandlers();
		})();

	
		(function onload(){
			var departureDate = new Date((new Date()).getTime() + 7*24*60*60*1000),
				returnDate = new Date((new Date()).getTime() + 14*24*60*60*1000);
			$('[name="departure_date-proxy"]').val($.datepicker.formatDate('dd.mm.yy', departureDate));
			$('[name="departure_date"]').val($.datepicker.formatDate('yy-mm-dd', departureDate));
			$('[name="return_date-proxy"]').val($.datepicker.formatDate('dd.mm.yy', returnDate));
			$('[name="return_date"]').val($.datepicker.formatDate('yy-mm-dd', returnDate));
		})();
		
	})();
	
	
	
	(function logoCarousel() {
		$.fn.agCarousel = function( option ) {
			return this.each(function( i ){
			
				var carouselPixelsPerSecond = 5,
					carousel = $(this),
					carouselItems = $('.carousel_items', carousel);
					
				if ( option === 'destroy' ) {
				
					$('.carousel_items.clone', carousel).remove();
					carouselItems.css('margin-left', 0);
					carouselItems.stop();
					carousel.hide();
					
				} else {
				
					(function infiniteCarousel(carouselItems, carouselItemsClone) {
						carousel.show();
						var carouselWidth = carousel.width(),
							carouselItemsWidth = carouselItems.width();

						carouselItemsClone = carouselItemsClone || carouselItems.clone().addClass('clone').insertAfter(carouselItems);
						
						carouselItems.animate({
							marginLeft: -carouselItemsWidth
						},{
							duration: 90000,
							specialEasing: {
								marginLeft: 'linear'
							},
							complete: function(){
								carouselItems.insertAfter( carouselItemsClone ).css({
									marginLeft: 0
								});
								infiniteCarousel(carouselItemsClone, carouselItems);
							}
						});
					}) (carouselItems);
				}
				
			
			});
			
		} 
		
		
		$('.carousel').clone().hide().removeClass('carousel').addClass('carousel-progressbar').appendTo('.progressbar-container .logo-carousel');
		
		$('.carousel').agCarousel();
		
		
	})();
	
	
	
});

if (!Array.prototype.filter)
{
  Array.prototype.filter = function(fun /*, thisp */)
  {
    "use strict";

    if (this == null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun != "function")
      throw new TypeError();

    var res = [];
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in t)
      {
        var val = t[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, t))
          res.push(val);
      }
    }

    return res;
  };
}
