// ----- Главная страница по авиаперелетам и всего сайта ----- //
var flightSegments = 3;

topCities = [
	{	Name: 'Москва', Country: 'Россия', Id: '607b4aa2-5281-406c-a2ce-4bd52c29ef9a', Code: 'MOW' },
	{	Name: 'Санкт-Петербург', Country: 'Россия', Id: '48e5f1c7-aa5f-4d1f-adcb-61e87f3b45bf', Code: 'LED' },
	{	Name: 'Екатеринбург', Country: 'Россия', Id: 'c7a16438-08f9-4fe1-ae72-318a0ffba95e', Code: 'SVX' },
	{	Name: 'Новосибирск', Country: 'Россия', Id: 'd5f518ca-3df1-4c34-bf5e-2659e207acca', Code: 'OVB' },
	{	Name: 'Хельсинки', Country: 'Финляндия', Id: '44775e13-d38b-4eb0-99a8-b8f7118cc793', Code: 'HEL' },
	{	Name: 'Краснодар', Country: 'Россия', Id: '552a5eee-63ab-4e41-b7d3-76c9ed94c3af', Code: 'KRR' },
	{	Name: 'Красноярск', Country: 'Россия', Id: '98312b25-5566-46ce-912b-66a9f4f93034', Code: 'KJA' },
	{	Name: 'Самара', Country: 'Россия', Id: 'f6c81bcd-e307-4b78-867e-20ab104e3bb0', Code: 'KUF' },
	{	Name: 'Хабаровск', Country: 'Россия', Id: 'c8547b82-8660-476a-9b91-1d98d0f511ea', Code: 'KHV' },
	{	Name: 'Владивосток', Country: 'Россия', Id: '2963f88c-febd-4d17-afcc-058ba89d74d8', Code: 'VVO' },
	{	Name: 'Ростов-на-Дону', Country: 'Россия', Id: 'a12e8b34-1823-402c-b81b-6377420cb217', Code: 'ROV' },
	{	Name: 'Сургут', Country: 'Россия', Id: '81746f88-f966-437d-ad4a-e371191f6ddd', Code: 'SGC' }
];

//var aviaFromExamples = topCitiesFrom.splice( 0, 3 );
var aviaFromExamples = topCities.splice( 0, 3 );
/*[
	{	Name: 'Москва', Country: 'Россия', Id: '607b4aa2-5281-406c-a2ce-4bd52c29ef9a', Code: 'MOW' },
	{	Name: 'Санкт-Петербург', Country: 'Россия', Id: '48e5f1c7-aa5f-4d1f-adcb-61e87f3b45bf', Code: 'LED' },
	{	Name: 'Екатеринбург', Country: 'Россия', Id: 'c7a16438-08f9-4fe1-ae72-318a0ffba95e', Code: 'SVX' }
];*/

//var shuffledExamples = shuffleArray( topCitiesTo );
var shuffledExamples = shuffleArray( topCities );
var aviaToExamples = [
	shuffledExamples.slice( 0, 3 ),
	shuffledExamples.slice( 3, 6 ),
	shuffledExamples.slice( 6, 9 )/*,
	shuffledExamples.slice( 9, 12 )*/
];

/*var aviaToExamples = [
	{	Name: 'Стамбул', Country: 'Турция', Id: 'aeb7c40a-0f69-4956-86e8-cef31d661fed', Code: 'IST' },
	{	Name: 'Лондон', Country: 'Великобритания', Id: 'a7ae7edd-919a-4760-8326-def488cafa6c', Code: 'LON' },
	{	Name: 'Тель-Авив', Country: 'Израиль', Id: 'dce24d78-a79c-4932-9280-b2f5b4fca077', Code: 'TLV' },
	{	Name: 'Бангкок', Country: 'Тайланд', Id: '119b46aa-ac71-47e4-9262-e630d2e0e5f0', Code: 'BKK' }
];*/

// -------------------------------------------------------------------------- //

AviaController = function() {
	AviaController.superClass.apply( this, arguments );
	
	this.Id = 'AviaController';
	this.sended = false;
	this.searchUrl = '/flight/search/';
	this.form = this.createForm( AviaForm, this.getEl( 'form' ) );

	this.form.attachObserver( 'FormNumberOfDatesChanged', this.setNumberOfDatesInCalendar, this );
	this.form.attachObserver( 'FormNumberOfCitiesChanged', this.form.setRemovableToLastInput, this.form );

	this.calendar = new Calendar( this.getEl( 'calendar-wrap' ), today, date365 );
	this.calendar.changeMode( 1 );
	this.calendar.attachObserver( 'CalendarDaySelected', this.form.setInputDate, this.form );
	this.calendar.attachObserver( 'CalendarDayUnSelected', this.form.unsetInputDate, this.form );
	
	this.form.attachObserver( 'DateInputSetted', this.calendar.setDate, this.calendar );

	this.persons = new aviaPersons( this.getEl( 'persons' ) );
	this.persons.attachObserver( 'PersonCountChanged', function(){ $('#resetForm').removeClass( 'hidden' ); }, this );
	
	if ( ipCity[ 'Id' ] != '' ){
		this.form.inputs[ 0 ].setDefault( ipCity, ipCity[ 'Name' ] );
	}
}
AviaController.inheritsFrom( Controller );

// -------------------------------------------------------------------------- //

AviaController.prototype.send = function() {
	/*var formParams = this.form.getParams();
	var persons = this.persons.getValue();

	this.searchStoreSaveParams.addParams({ 'Commander.Command': 'SearchAirTariffsCalendar' });
	this.searchStoreSaveParams.addParams( formParams );
	this.searchStoreSaveParams.addParams( persons );
	this.searchStoreSaveParams.load();
}

AviaController.prototype.checkStateOfStoreSaveParams = function(){*/
	if( this.sended ) return;
	
	this.sended = true;
	
	var formParams = this.form.getParams();
	var persons = this.persons.getValue();

	this.searchStore.addParams({ 'Commander.Command': usedCommand });
	this.searchStore.addParams( formParams );
	this.searchStore.addParams( persons );
	this.searchStore.load();
}

// -------------------------------------------------------------------------- //

// из Global заполняем данными
AviaController.prototype.init = function( data ) {
	var i = 0, j = 0;
	//return; //выход из функции для отключения функционала
	var flags = this.form.isRoundTrip( data.Routes );
	var to = false;
	
	for ( var Route in data.Routes ) {
		if ( !this.form.inputs[ i + 1 ] && data.Routes[ Route ][ 'From' ][ 'Id' ] == to ) {
			this.form.addFields({ 'returnFlag': flags[ i ] });
		}

		if ( !this.form.inputs[ i + 1 ] && data.Routes[ Route ][ 'From' ][ 'Id' ] != to ) {
			this.form.addFieldsOpenJaw({ 'returnFlag': flags[ i ] });
			i++;
		}

		this.form.inputs[ i ].setDefault( data.Routes[ Route ][ 'From' ], data.Routes[ Route ][ 'From' ][ 'Name' ] );
		this.form.inputs[ i + 1 ].setDefault( data.Routes[ Route ][ 'To' ], data.Routes[ Route ][ 'To' ][ 'Name' ] );
		to = data.Routes[ Route ][ 'To' ][ 'Id' ];

		var date = this.translateDate( data.Routes[ Route ][ 'Date' ] );

		if( date instanceof Date && date.valueOf() >= window.today.valueOf() ) {
			this.form.dates[ j ].setDefault( date );
		}
		i++;
		j++;
	}
		
	if( data[ 'Class' ] ) {
		this.form.tripClass.setInitialValue( data[ 'Class' ] );
	}
	this.form.check();

	if( data[ 'PersonsCount' ] ) {
		this.persons.set(
			Number( data[ 'PersonsCount' ][ 'Adults' ] ),
			Number( data[ 'PersonsCount' ][ 'Children' ] ),
			Number( data[ 'PersonsCount' ][ 'Infants' ] )
		);
	}
}

// заполняем из данных по ссылке партнера
AviaController.prototype.initDataFromPartner = function( data ) {
	var j=0;
	for (var idx in data) {
		if (!this.form.inputs[j]) {
			var roundT = (idx == 'To');
			this.form.addFields( {'returnFlag': roundT} );
		}
		this.form.inputs[j].setDefault( data[idx], data[idx]['Name'] );
		j++;
	}
}

// -------------------------------------------------------------------------- //
// -------------------------------- Form ------------------------------------ //
// -------------------------------------------------------------------------- //

AviaForm = function( target ) {
	AviaForm.superClass.apply( this, arguments );
	this.table = this.getEl( 'form-table' );
	this.add_remove_controls = this.getEl( 'add-remove-controls' );
	this.arrowImages = this.buildArrowImgArray();

	this.inputs[ 0 ] = new NPredicateInput({
		'target': this.getEl( 'input1' ),
		'type': 'text predicate',
		'name': 'From',
		'examples': aviaFromExamples,
		'settings': FieldsSettings[ 'AviaCityFrom' ]
	});	

	this.inputs[ 0 ].idx = 0;
	this.inputs[ 0 ].elementInput.tabIndex = 1;
	this.inputs[ 0 ].attachObserver( 'inputSetted', this.onInputSetted, this );
	this.inputs[ 0 ].attachObserver( 'inputStatusChange', function(){ this.check(); }, this );
	
	this.dates = new Array();
	this.dates[ 0 ] = new NDateInput({
		'target': this.getEl( 'date1' ),
		'type': 'd0',
		'name': 'DateFrom',
		'min': today,
		'max': date365,
		'settings': FieldsSettings[ 'IndexAviaDate' ]
	});

	this.dates[ 0 ].elementInput.tabIndex = 2;
	this.dates[ 0 ].attachObserver( 'inputSetted', this.onInputSetted, this );
	this.dates[ 0 ].attachObserver( 'inputStatusChange', function(){ this.check(); }, this );

	this.inputs[ 1 ] = new NPredicateInput({
		'target': this.getEl( 'input2' ),
		'type': 'text predicate',
		'name': 'To',
		'examples': aviaToExamples[ 0 ],
		'settings': FieldsSettings[ 'AviaCityTo' ]
	});	

	this.inputs[ 1 ].idx = 1;
	this.inputs[ 1 ].elementInput.tabIndex = 3;
	this.inputs[ 1 ].attachObserver( 'inputSetted', this.onInputSetted, this );
	//this.inputs[ 1 ].attachObserver( 'inputBlured', this.onInputBlured, this );
	this.inputs[ 1 ].attachObserver( 'inputStatusChange', function(){ this.check(); }, this );
	
	this.elementReturnFlight = this.createNode( 'span', { 'id' : 'return', 'class': 'actionstext' }, this.add_remove_controls, 'обратно' );
	this.addHandler( this.elementReturnFlight, 'click', this.addFields, { 'returnFlag': true } );
	
	this.createNode( 'span', { 'class' : 'continue' }, this.add_remove_controls, '|' );

	this.elementContunueFlight = this.createNode( 'span', { 'id' : 'continue', 'class': 'actionstext' }, this.add_remove_controls, 'продолжить маршрут' );
	this.addHandler( this.elementContunueFlight, 'click', this.addFields, { 'returnFlag': false } );

	this.createNode( 'span', { 'class' : 'continue' }, this.add_remove_controls, '|' );

	this.elementOpenJaw = this.createNode( 'span', { 'id' : 'break', 'class': 'actionstext' }, this.add_remove_controls, 'разомкнуть маршрут' );

/*	this.elementReturnFlight = this.createNode( 'span', { 'id' : 'return', 'class': 'actionstext' }, this.add_remove_controls, 'Обратно' );
	this.addHandler( this.elementReturnFlight, 'click', this.addFields, { 'returnFlag': true } );
	
	this.createNode( 'span', { 'class' : 'continue' }, this.add_remove_controls, '|' );

	this.createNode( 'span', { 'class': 'actionstitle' }, this.add_remove_controls, 'Маршрут:' );

	this.elementContunueFlight = this.createNode( 'span', { 'id' : 'continue', 'class': 'actionstext' }, this.add_remove_controls, 'продолжить' );
	this.addHandler( this.elementContunueFlight, 'click', this.addFields, { 'returnFlag': false } );

	this.createNode( 'span', { 'class' : 'continue' }, this.add_remove_controls, '' );

	this.elementOpenJaw = this.createNode( 'span', { 'id' : 'break', 'class': 'actionstext' }, this.add_remove_controls, 'разомкнуть' );*/
	this.addHandler( this.elementOpenJaw, 'click', this.addFieldsOpenJaw, { 'returnFlag': false, 'openJaw': true } );

	this.tripClass = new NSelect({
		'target': this.getEl( 'class' ),
		'type': 'select',
		'name': 'tripClass',
		'list': [
			{ 'Name': 'Эконом', 'Value': 'ECONOMY', 'HTML': ['<small>Эконом</small>'] },
			{ 'Name': 'Бизнес', 'Value': 'BUSINESS', 'HTML': ['<small>Бизнес</small>'] }
		],
		'initialValue': 'ECONOMY',
		'settings': FieldsSettings[ 'AviaClass' ]
	});
	this.tripClass.elementInput.tabIndex = 10;
	this.tripClass.attachObserver( 'inputSetted', function(){ $('#resetForm').removeClass( 'hidden' ); }, this );
}
AviaForm.inheritsFrom( IndexForm );

// -------------------------------------------------------------------------- //
// продолжить маршрут или выбрать обратно
AviaForm.prototype.addFields = function(params) {
	var insertHTML = '';

	var isReturn = params.returnFlag;
	var inpts = ( this.openJaw ? this.inputs.length - 1 : this.inputs.length );
	
	if (inpts >= 5) {
		return;
	}
	$('#resetForm').removeClass( 'hidden' );
	
	//Add more table rows		
	var tr = this.insRow();
	var td = tr.insertCell(0);
	td.className = 'line ' + routeColors[ this.dates.length ];
	td = tr.insertCell(1);
	td.id = 'date' + (this.dates.length + 1);
	
	$('#form tr.one_way').removeAttr( 'class' );
	tr = this.insRow();
	tr.className = 'one_way';
	td = tr.insertCell(0);
	td.className = (isReturn) ? 'back' : 'middle step' + ( inpts + 1 );
	var pointDIV = this.createNode('div', {'class':'point'}, td);
	var idx = isReturn ? 2 : 1;
	pointDIV.appendChild( this.arrowImages[ inpts - 1 ][ idx ] );
	
	if (this.arrowImages[ inpts ] && this.arrowImages[ inpts ][ 0 ]) {
		pointDIV.appendChild( this.arrowImages[ inpts ][ 0 ]);
	}
	td = tr.insertCell(1);
	td.className = 'input input' + ( inpts + 1 );
	td.id = 'input' + ( this.inputs.length + 1 );

	this.dates[ this.dates.length ] = new NDateInput({ 
		'target': this.getEl( 'date' + (this.dates.length+1) ),
		'type': 'd' + this.dates.length,
		'name': 'DateTo',
		'min': this.dates[ this.dates.length - 1 ].getData() || new Date(),
		'max': date365,
		'settings': FieldsSettings[ 'IndexAviaDate' ]
	});

	this.dates[ this.dates.length - 1 ].elementInput.tabIndex = ( this.dates.length + this.inputs.length );
	this.dates[ this.dates.length - 1 ].attachObserver( 'inputSetted', this.onInputSetted, this );
	this.dates[ this.dates.length - 1 ].attachObserver( 'inputStatusChange', function(){ this.check(); }, this );

	//Add Predicate field
	if( isReturn ) {
		this.inputs[ this.inputs.length ] = new NPredicateInput({
			'target': this.getEl( 'input' + ( this.inputs.length + 1 ) ),
			'type': 'text predicate',
			'name': 'To',
			'examples': aviaFromExamples,
			'settings': FieldsSettings[ 'AviaCityReturn' ]
		});	
	} else {
		this.inputs[ this.inputs.length ] = new NPredicateInput({
			'target': this.getEl( 'input' + ( this.inputs.length + 1 ) ),
			'name': 'To',
			'type': 'text predicate',
			'examples': aviaToExamples[ this.inputs.length - 1 ],
			'settings': FieldsSettings[ 'AviaCityTo' ]
		});	
	}

	this.inputs[ this.inputs.length - 1 ].idx = this.inputs.length - 1;
	this.inputs[ this.inputs.length - 1 ].elementInput.tabIndex = ( this.dates.length + this.inputs.length );
	this.inputs[ this.inputs.length - 1 ].attachObserver( 'inputSetted', this.onInputSetted, this );
	this.inputs[ this.inputs.length - 1 ].attachObserver( 'inputStatusChange', function(){ this.check(); }, this );

	if ( isReturn ) {
		this.backInput = this.inputs[ this.inputs.length - 1 ];
		if ( this.inputs[ 0 ].data ){
			this.backInput.setDefault( this.inputs[ 0 ].getData(), this.inputs[ 0 ].getValue() );
		}
	}
	this.notify( 'FormNumberOfDatesChanged', this.dates.length );
	this.notify( 'FormNumberOfCitiesChanged' );		//, this.inputs.length - 1
	this.check();
}

// -------------------------------------------------------------------------- //
AviaForm.prototype.addFieldsOpenJaw = function( params ) {
	if ( this.openJaw )	return;
	this.openJaw = true;
	this.setClassName( 'disabled', true, this.elementOpenJaw );
	this.elementOpenJaw.previousSibling.className = 'continue disabled';
	var insertHTML = '';
	var isReturn = params.returnFlag;
	var inpts = this.inputs.length;
	
	if ( inpts > 2 ){
		this.inputs[ this.inputs.length - 1 ].setRemovable();
	}
	
	if (inpts >= 5) {
		return;
	}
	$('#resetForm').removeClass( 'hidden' );
	
	//Add more table rows		
	tr = this.insRow();
	td = tr.insertCell(0);
	td.className = 'middle break';
	var pointDIV = this.createNode('div', {'class':'point'}, td);
	var imgOpenJaw = new Image();
	imgOpenJaw.src = '/images/s.gif';
	imgOpenJaw.width = 84;
	imgOpenJaw.height = 25;
	pointDIV.appendChild( imgOpenJaw );
	
	tr.className = 'openJaw_bottom';
	$('#form tr.one_way').addClass( 'openJaw_top' ).removeClass( 'one_way' );
	
	if ( this.arrowImages[ inpts - 1 ] && this.arrowImages[ inpts - 1 ][ 0 ] ) {
		pointDIV.appendChild( this.arrowImages[ inpts - 1 ][ 0 ] );
	}
	td = tr.insertCell(1);
	td.className = 'input input' + ( inpts + 1 );
	td.id = 'input' + ( this.inputs.length + 1 );

	//Add Predicate field

	
	this.inputs[ this.inputs.length ] = new NPredicateInput({
		'target': this.getEl( 'input' + ( this.inputs.length + 1 ) ),
		'type': 'text predicate',
		'name': 'From',
		'examples': aviaToExamples[ this.inputs.length - 1 ],
		'settings': FieldsSettings[ 'AviaCityFrom' ]
	});

	this.inputs[ this.inputs.length - 1 ].idx = this.inputs.length - 1;
	this.inputs[ this.inputs.length - 1 ].elementInput.tabIndex = ( this.dates.length + this.inputs.length );
	this.inputs[ this.inputs.length - 1 ].attachObserver( 'inputSetted', this.onInputSetted, this );
	this.inputs[ this.inputs.length - 1 ].attachObserver( 'inputStatusChange', function(){ this.check(); }, this );
	this.inputOpenJaw = this.inputs[ this.inputs.length - 1 ];

	// вставка строки под дату
	var tr = this.insRow();
	var td = tr.insertCell(0);
	td.className = 'line ' + routeColors[ this.dates.length ];
	td = tr.insertCell(1);
	td.id = 'date' + (this.dates.length + 1);

	this.dates[ this.dates.length ] = new NDateInput({ 
		'target': this.getEl( 'date' + (this.dates.length+1) ),
		'type': 'd' + this.dates.length,
		'name': 'DateFrom',
		'min': this.dates[ this.dates.length - 1 ].getData() || new Date(),
		'max': date365,
		'settings': FieldsSettings[ 'IndexAviaDate' ]
	});

	this.dates[ this.dates.length - 1 ].elementInput.tabIndex = ( this.dates.length + this.inputs.length );
	this.dates[ this.dates.length - 1 ].attachObserver( 'inputSetted', this.onInputSetted, this );
	this.dates[ this.dates.length - 1 ].attachObserver( 'inputStatusChange', function(){ this.check(); }, this );


	// вставляем поле куда
	tr = this.insRow();
	tr.className = 'one_way';
	td = tr.insertCell(0);
	td.className = 'middle';
	var pointDIV = this.createNode('div', {'class':'point'}, td);
	var idx = isReturn ? 2 : 1;
	pointDIV.appendChild( this.arrowImages[ inpts - 1 ][ idx ] );
	
	if (this.arrowImages[ inpts ] && this.arrowImages[ inpts ][ 0 ]) {
		pointDIV.appendChild( this.arrowImages[ inpts ][ 0 ] );
	}
	td = tr.insertCell(1);
	td.className = 'input input' + ( this.inputs.length + 1 );
	td.id = 'input' + ( this.inputs.length + 1 );

	//Add Predicate field	
	this.inputs[ this.inputs.length ] = new NPredicateInput({
		target: this.getEl( 'input' + ( this.inputs.length + 1 ) ),
		'type': 'text predicate',
		'name': 'To',
		'examples': aviaToExamples[ this.inputs.length - 1 ],
		'settings': FieldsSettings[ 'AviaCityTo' ]
	});	
	
	this.inputs[ this.inputs.length - 1 ].idx = this.inputs.length - 1;
	this.inputs[ this.inputs.length - 1 ].elementInput.tabIndex = ( this.dates.length + this.inputs.length );
	this.inputs[ this.inputs.length - 1 ].attachObserver( 'inputSetted', this.onInputSetted, this );
	this.inputs[ this.inputs.length - 1 ].attachObserver( 'inputStatusChange', function(){ this.check(); }, this );

	if ( isReturn ) {
		this.backInput = this.inputs[ this.inputs.length - 1 ];
		if ( this.inputs[ 0 ].data ){
			this.backInput.setDefault( this.inputs[ 0 ].getData(), this.inputs[ 0 ].getValue() );
		}
	}
	this.notify( 'FormNumberOfDatesChanged', this.dates.length );
	this.notify( 'FormNumberOfCitiesChanged' );		//, this.inputs.length - 1
	this.check();
}

// -------------------------------------------------------------------------- //
// вставить строку в таблицу
AviaForm.prototype.insRow = function( index ) {
	index = index || this.table.rows.length;
	return this.table.insertRow( index );
}

// удалить строку из таблицы
AviaForm.prototype.delTableRow = function( index ) {
	this.table.deleteRow( index );
}

// ---------------------------------------------------------------------------//

// после изменения данных в поле вызывается эта функция
AviaForm.prototype.onInputSetted = function( params, obj ) {
	$('#resetForm').removeClass( 'hidden' );	
	if ( obj[ 'Id' ] == 'DateInput' && !obj.error ){
		var date = obj.getData();
		var index = Number( obj.type.substr( 1 ) );
		this.notify( 'DateInputSetted', { index: index, data: date } );
		this.setMinToNextDate( index, date );
		this.setMaxToPrevDate( index, date );
	}
	this.checkInputDuplicates();
	if ( !obj.errorFromController ) {
		this.checkIfReturnFlight( obj );
		if ( obj[ 'name' ] == 'From' && this.backInput /*&& !!this.backInput.Id*/ ) {
			this.backInput.setDefault( this.inputs[ 0 ].getData(), this.inputs[ 0 ].getValue() );
		}
	}
}

AviaForm.prototype.checkInputDuplicates = function() {
	for( var i = 0, len = this.inputs.length; i < len; i++ ) {
		if( this.inputs[ i ].data ) {
			if ( this.inputs[ i + 1 ] && this.inputs[ i + 1 ].data ) {			
				if ( this.inputOpenJaw && this.inputOpenJaw == this.inputs[ i + 1 ] ) {}
				else if ( this.inputs[ i + 1 ].data.Id == this.inputs[ i ].data.Id ) { //если совпадает с предыдущим
					this.inputs[ i + 1 ].errorControllerText = 'Пункт вылета не может совпадать с пунктом прилета';
					this.inputs[ i + 1 ].errorFromController = true;
					this.inputs[ i + 1 ].checkPattern();
					break;
				}
			}
		}
	}
}

// проверка на обратную дорогу.
// если текущий город совпадает с начальным, то он является городом возврата
// если редактируем первый, то если он не соврадает с городом возврата, то последний превращается в продолжение и наоборот
AviaForm.prototype.checkIfReturnFlight = function( obj ) {
	if ( this.inputs.length == 2 ) {
		delete this.backInput;
		return;
	}

	var lastInpt = this.inputs[ this.inputs.length - 1 ];
	if (obj.idx == lastInpt.idx && obj.idx > 1 || obj.name == 'From' ) {
		var TD = lastInpt.elementParent.parentNode.previousSibling;
		if ( 
			lastInpt.data.Id &&
			this.inputs[ 0 ].data.Id &&
			lastInpt.data.Id == this.inputs[ 0 ].data.Id
		) {
			this.backInput = lastInpt;		
			TD.className = 'back';
			TD.firstChild.replaceChild( this.arrowImages[ ( this.openJaw ? lastInpt.idx - 1 : lastInpt.idx ) - 1 ][ 2 ], TD.firstChild.firstChild );
		}
		else if ( this.backInput && this.backInput.data ) {
			this.backInput = false;
			TD.className = 'middle step' + lastInpt.idx;
			TD.firstChild.replaceChild( this.arrowImages[ ( this.openJaw ? lastInpt.idx - 1 : lastInpt.idx ) - 1 ][ 1 ], TD.firstChild.firstChild );
		}
	}
	this.checkAddRemoveLinks();
}

// в зависимости от количества сегментов и наличия конечного пунка показываем или скрываем ссылки

AviaForm.prototype.checkAddRemoveLinks = function() {
	if (
		( this.openJaw ? this.inputs.length - 1 : this.inputs.length ) <= flightSegments &&
		!( this.backInput && this.backInput.Id )
	) {
		this.add_remove_controls.className = routeColors[ ( this.openJaw ? this.inputs.length - 1 : this.inputs.length ) - 1 ];
	}
	else {
		this.add_remove_controls.className = 'hidden';
	}
}

// ---------------------------------------------------------------------------//
// сброс данных в форме
AviaForm.prototype.reset = function(){
	var i = this.inputs.length;
	var d = this.dates.length;
	while (i > 0) {
		i--;
		d--;
		this.inputs[ i ].reset();
		if ( this.dates[ d ] ) {
			this.dates[ d ].clear();
			this.dates[ d ].setMin( today );
			this.dates[ d ].setMax( date365 );
		}
		if (i > 1) {
			this.removeLastInput( true );
			i = this.inputs.length;
		}
	}
	this.tripClass.setInitialValue( this.tripClass.initialValue );
	this.status = false;
}

// удаление последнего поля из списка
AviaForm.prototype.removeLastInput = function( isReset ){
	var idx = this.inputs.length - 1;
	var idxD = this.dates.length;
	this.dates[ idxD - 1 ].clear();
	this.dates[ idxD - 1 ].remove();
	this.dates.splice( idxD - 1, 1 );
	this.inputs[ idx ].remove();	
	this.inputs.splice( idx, 1 );
	if ( this.inputOpenJaw == this.inputs[ idx - 1 ] ){
		this.inputs[ idx - 1 ].remove();	
		this.inputs.splice( idx - 1, 1 );
		delete this.inputOpenJaw;
		delete this.openJaw;
		this.setClassName( 'disabled', false, this.elementOpenJaw );
		this.elementOpenJaw.previousSibling.className = 'continue';
	}
	
	while( this.table.rows.length > this.dates.length + this.inputs.length ) {
		this.delTableRow( this.table.rows.length - 1 );
	}

	this.notify( 'FormNumberOfDatesChanged', this.dates.length );
	this.notify( 'FormNumberOfCitiesChanged' );		//, this.inputs.length

	this.table.rows[ this.table.rows.length - 1 ].className = 'one_way';
	if ( isReset != true ) {
		this.checkIfReturnFlight( this.inputs[ this.inputs.length - 1 ] );
	}
	this.check();
}

// ---------------------------------------------------------------------------//
// дать возможность удалить последний пункт
AviaForm.prototype.setRemovableToLastInput = function() {
	if (this.inputs.length > 2) {
		if (this.inputs.length > 3 && this.inputs[ this.inputs.length - 2 ].elementControl) {
			this.inputs[ this.inputs.length - 2 ].setRemovable(); //remove delete Control for prev Input
		} 
		var theInput = this.inputs[ this.inputs.length - 1 ];		
		theInput.setRemovable(); //set remove Control for current Input
		theInput.attachObserver('RemoveMe', this.removeLastInput, this);
	}
	this.checkAddRemoveLinks();
}

// ---------------------------------------------------------------------------//
// получить параметры формы
AviaForm.prototype.getParams = function() {
	var result = new Object();
	var index = 1;
	for (var k = 0; k < this.inputs.length; k++) {
		if ( this.inputs[ k + 1 ] && this.inputs[ k + 1 ].name != 'From' ){
			result[ 'From' + index ] = this.inputs[ k ].getValueToParam();	//getData( 'Code' );
			result[ 'To' + index ] = this.inputs[ k + 1 ].getValueToParam();	//getData( 'Code' );
			index++;
		}
	}
	for (var k = 0; k < this.dates.length; k++) {
		result[ 'Date' + ( k + 1 ) ] = this.dates[ k ].getValueToParam();
	}
	if( !result.From1 || !result.To1 ) return false;
	result[ 'ServiceClass' ] = this.tripClass.getData( 'Value' );
	return result;
}

// ---------------------------------------------------------------------------//
// определить является ли маршрут зацикленным
AviaForm.prototype.isRoundTrip = function(Routes) {
	var counter = 0;
	var firstCity = '';
	var flags = [];
	
	for (var Route in Routes) {
		if  (counter == 0) {
			firstCity = Routes[ Route ][ 'From' ][ 'Id' ];
		}
		flags[counter] = (firstCity == Routes[ Route ][ 'To' ][ 'Id' ]);
		if ( flags[counter] ) Global.Avia.roundTrip = true;
		counter++;
	}
	return flags;
}

// ------------------------ buildArrowImgArray -------------------------------//

AviaForm.prototype.buildArrowImgArray = function() {
	var ImgArray = new Array();
	var path = '/images/index/';
	var imgHeigth = ['112', '25', '74'];
	var imgExt = ('\v' == 'v') ? '.gif' : '.png'
	
	for (var i = 0; i < 4; i++) {
		ImgArray[i] = new Array();
		for (var j = 0; j < 3; j++) {
			if ( !(i==0 && j==2) ) {
				var cls = (j==0) ? 'next' : '';
				ImgArray[i][j] = new Image();
				ImgArray[i][j].src = path + 'step' + ( i + 1 ) + '_' + ( j + 1 ) + imgExt;
				ImgArray[i][j].width = '84';
				ImgArray[i][j].height = imgHeigth[ j ];
				ImgArray[i][j].className = cls;
			}
		}
	}
	return ImgArray;
}

// -------------------------------------------------------------------------- //
// -------------------------------- Persons --------------------------------- //
// -------------------------------------------------------------------------- //

aviaPersons = function() {
	
	this.Id = 'aviaPersons';
	
	this.adultTitle = 'Взрослый';
	this.childTitle = 'Ребенок';
	this.babyTitle = 'Младенец';
	
	this.babyNameNC = 'младенец';
	this.babyNameNCPl = 'младенца';
	this.babyNameGCWithoutSeat = 'младенца до 2-х лет без предоставления места';
	this.babyNameGCWithSeat = 'младенца до 2-х лет c предоставлением места';
	this.babyNameGC = this.babyNameGCWithoutSeat;
	
	this.childNameNC = 'ребенок';
	this.childNameNCPl = 'детей';
	this.childNameGC = 'ребенка от 2-х до 12-ти лет с предоставлением места';
	
	this.adultNameNC = 'взрослый';
	this.adultNameNCPl = 'взрослых';
	this.adultNameGC = 'взрослого (старше 12-ти лет)';

	aviaPersons.superClass.apply( this, arguments );

	this.setLabel( 'Количество пассажиров:' );

	this.setControl( 'baby' );
	this.setControl( 'child' );
	this.setControl( 'adult' );

	this.checkOnDisable();
	this.setTitle();
}
aviaPersons.inheritsFrom( Persons );

// -------------------------------------------------------------------------- //

aviaPersons.prototype.checkOnDisable = function() {
	this.setDisabled( 'adult', this.seats == 4 );
	this.setDisabled( 'child', this.seats == 4 );

	var toAllowSeat = ( this.baby == this.adult && this.seats == this.adult + this.child );
	this.setSeatToBaby( toAllowSeat );
	
	var toDisable = ( ( this.baby == this.adult + 1 && this.seats == this.adult + this.child + 1 ) ||
					  ( this.baby == this.adult && this.seats == this.adult + this.child && this.seats == 4 ) );
	this.setDisabled( 'baby', toDisable );
	
	
	this.lastAdult.setClassName( 'no', this.adult == 1 );
}

aviaPersons.prototype.check = function( obj ) {
	if( ( ( obj.age == 'adult' || obj.age == 'child' ) && this.seats == 4 ) ||
		  ( obj.age == 'baby' &&
				( ( this.baby == this.adult + 1 && this.seats == this.adult + this.child + 1 ) ||
				  ( this.baby == this.adult && this.seats == this.adult + this.child && this.seats == 4 ) )
		  )
	) {
		return false;
	}
	return true;
}

// -------------------------------------------------------------------------- //

onload = function() {
	controller = new AviaController();

	if ( dataPromo ) controller.initDataFromPartner( dataPromo )
	else if( Global[ 'Avia' ] ) controller.init( Global[ 'Avia' ] );
}
