var flightSegments = 3;
var aviaExamples = [
	{	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 perdicateErrorTexts = {
	errorPatternText: 'Неизвестный город или аэропорт',
	errorEmptyText: 'Введите название города'
}
// -------------------------------------------------------------------------- //

AviaController = function() {
	AviaController.superClass.apply( this, arguments );
	
	this.Id = 'AviaController';
	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' ), now, 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 );
}
AviaController.inheritsFrom( Controller );

// -------------------------------------------------------------------------- //

AviaController.prototype.send = function() {
	//var oParams = new Object();
	var formParams = this.form.getParams();
	var persons = this.persons.getValue();
	//oParams['RoundTrip'] = ( this.form.backInput ) ? true : false;

	//if( this.promo && this.promo.getData() ) oParams[ 'PromoCode'] = this.promo.getData();

	this.searchStoreSaveParams.addParams({ 'Commander.Command': 'SearchAirTariffsCalendar' });
	this.searchStoreSaveParams.addParams( formParams );
	this.searchStoreSaveParams.addParams( persons );
	this.searchStoreSaveParams.load();
}

AviaController.prototype.checkStateOfStoreSaveParams = function(){
	var formParams = this.form.getParams();
	var persons = this.persons.getValue();

	this.searchStore.addParams({ 'Commander.Command': 'SearchAirTariffsCalendar' });
	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 ) {
			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 PredicateInput({
		target: this.getEl( 'input1' ),
		type: 'text predicate',
		big: true,
		name: 'From',
		label: 'откуда',
		tip: 'город или аэропорт',
		examples: aviaExamples,
		required: true,
		errorPatternText: perdicateErrorTexts[ 'errorPatternText' ],
		errorEmptyText: perdicateErrorTexts[ 'errorEmptyText' ]
	});
	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 DateInput({
		target: this.getEl( 'date1' ),
		type: 'd0',
		name: 'DateFrom',
		label: 'когда',
		tip: 'дд.мм.гггг',
		min: now,
		max: date365,
		required: true,
		errorInputText: datesErrorTexts[ 'errorInputText' ],
		errorPatternText: datesErrorTexts[ 'errorPatternText' ],
		errorEmptyText: datesErrorTexts[ 'errorEmptyText' ],
		errorMinMaxText: datesErrorTexts[ 'errorMinMaxText' ]
	});
	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 PredicateInput({
		target: this.getEl( 'input2' ),
		type: 'text predicate',
		big: true,
		name: 'To',
		label: 'куда',
		tip: 'город или аэропорт',
		examples: aviaExamples,
		required: true,
		errorPatternText: perdicateErrorTexts[ 'errorPatternText' ],
		errorEmptyText: perdicateErrorTexts[ 'errorEmptyText' ]
	});
	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.addHandler( this.elementOpenJaw, 'click', this.addFieldsOpenJaw, { 'returnFlag': false, 'openJaw': true } );

	this.tripClass = new Select({
		target: this.getEl( 'class' ),
		type: 'select',
		name: 'tripClass',
		label: 'класс',
		tip: 'класс',
		list: [
			{ Name: 'Эконом', Value: 'ECONOMY', HTML: ['<small>Эконом</small>'] },
			{ Name: 'Бизнес', Value: 'BUSINESS', HTML: ['<small>Бизнес</small>'] }
		],
		initialValue: 'ECONOMY'
	});
	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 DateInput({ 
		target: this.getEl( 'date' + (this.dates.length+1) ),
		type: 'd' + this.dates.length,
		name: 'DateTo',
		label: 'когда',
		tip: 'дд.мм.гггг',
		min: this.dates[ this.dates.length - 1 ].getData() || new Date(),
		max: date365,
		required: true,
		errorInputText: datesErrorTexts[ 'errorInputText' ],
		errorPatternText: datesErrorTexts[ 'errorPatternText' ],
		errorEmptyText: datesErrorTexts[ 'errorEmptyText' ],
		errorMinMaxText: datesErrorTexts[ 'errorMinMaxText' ]
	});
	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
	this.inputs[ this.inputs.length ] = new PredicateInput({
		target: this.getEl( 'input' + ( this.inputs.length + 1 ) ),
		type: 'text predicate',
		big: true,
		name: 'To',
		label: isReturn ? 'обратно' : 'куда',
		tip: 'город или аэропорт',
		examples: aviaExamples,
		required: true,
		errorPatternText: perdicateErrorTexts[ 'errorPatternText' ],
		errorEmptyText: perdicateErrorTexts[ 'errorEmptyText' ]
	});
	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		
/*	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 = 'middle break';
	var pointDIV = this.createNode('div', {'class':'point'}, td);
	//pointDIV.appendChild( this.arrowImages[ inpts - 1 ][ 1 ] );
	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 PredicateInput({
		target: this.getEl( 'input' + ( this.inputs.length + 1 ) ),
		type: 'text predicate',
		big: true,
		name: 'From',
		label: 'откуда',
		tip: 'город или аэропорт',
		examples: aviaExamples,
		required: true,
		errorPatternText: perdicateErrorTexts[ 'errorPatternText' ],
		errorEmptyText: perdicateErrorTexts[ 'errorEmptyText' ]
	});
	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 DateInput({ 
		target: this.getEl( 'date' + (this.dates.length+1) ),
		type: 'd' + this.dates.length,
		name: 'DateFrom',
		label: 'когда',
		tip: 'дд.мм.гггг',
		min: this.dates[ this.dates.length - 1 ].getData() || new Date(),
		max: date365,
		required: true,
		errorInputText: datesErrorTexts[ 'errorInputText' ],
		errorPatternText: datesErrorTexts[ 'errorPatternText' ],
		errorEmptyText: datesErrorTexts[ 'errorEmptyText' ],
		errorMinMaxText: datesErrorTexts[ 'errorMinMaxText' ]
	});
	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 PredicateInput({
		target: this.getEl( 'input' + ( this.inputs.length + 1 ) ),
		type: 'text predicate',
		big: true,
		name: 'To',
		label: 'куда',
		tip: 'город или аэропорт',
		examples: aviaExamples,
		required: true,
		errorPatternText: perdicateErrorTexts[ 'errorPatternText' ],
		errorEmptyText: perdicateErrorTexts[ 'errorEmptyText' ]
	});
	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 );
		this.checkAddRemoveLinks();
		if ( obj[ 'name' ] == 'From' && this.backInput /*&& !!this.backInput.Id*/ ) {
			this.backInput.setDefault( this.inputs[ 0 ].getData(), this.inputs[ 0 ].getValue() );
			//this.backInput.setTip( false );
			//this.backInput.setSetted( true );
		}
	}
}

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();
					/*this.inputs[i+1].showPad(false);							
					this.inputs[i+1].customError = true;
					this.inputs[i+1].setSetted( false );
					this.inputs[i+1].check();*/
					break;
				}
			}
			/*if (this.inputs[i].customError) {
				this.inputs[i].customError = false;
				this.inputs[i].setSetted( true );
				this.inputs[i].check();
				this.inputs[i].setError(!this.inputs[i].status);
			}*/
		}
	}
}

// проверка на обратную дорогу.
// если текущий город совпадает с начальным, то он является городом возврата
// если редактируем первый, то если он не соврадает с городом возврата, то последний превращается в продолжение и наоборот
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 ) {
			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 );
		}
	}
}

// в зависимости от количества сегментов и наличия конечного пунка показываем или скрываем ссылки
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';
	}
}

/*
// ---------------------------- onInputBlured --------------------------------//
AviaForm.prototype.onInputBlured = function( params, obj ) {
	if (obj.data.Id == this.inputs[ obj.idx - 1 ].data.Id) {
		return;
	}
	else {
		obj.customError = false;
		//obj.check();
	}
	return;
}
*/

// ---------------------------------------------------------------------------//
// сброс данных в форме
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( now );
			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 ].reset();
	this.inputs[ idx ].remove();	
	this.inputs.splice( idx, 1 );
	if ( this.inputOpenJaw == this.inputs[ idx - 1 ] ){
		//this.inputs[ idx - 1 ].reset();
		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();
			result[ 'To' + index ] = this.inputs[ k + 1 ].getValueToParam();
			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;
}

// ---------------------------- getError -------------------------------------//
/*
AviaForm.prototype.getError = function() {
	var errMsg = 'Город вылета совпадает с городом прилёта.';
	for( var i = 0, len = this.inputs.length; i < len; i++ ) {
		if( !this.inputs[ i ].status ) {
			errMsg = 'Вы не указали город ';
			switch ( i ) {
				case 0 : errMsg += 'вылета'; break;
				case 1 : errMsg += 'прилета'; break;
			}
			errMsg += '.\n';
			break;
		}
	}
	return errMsg;
}
*/
// ------------------------ 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 babyWSeats = this.babyWithSeatCount();
	//var toDisable = (this.baby > this.adult || ((this.baby/* - babyWSeats*/) == this.adult && this.seats == 4) )
	
	
	/*var toDisable = ( this.baby == this.adult );
	this.setDisabled( 'baby', toDisable );*/

	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;
}

// -------------------------------------------------------------------------- //

window.onload = function() {
	controller = new AviaController();

	if ( dataPromo ) controller.initDataFromPartner( dataPromo )
	else if( Global ) controller.init( Global[ 'Avia' ] );
}