﻿var config =
{
    //selectedDate: new Date(),
	selectedDate: null,
    dir: parseInt( Ajsl.Http.getParam('direction'), 10 ),
	lang: 'rus',
	
    headers:
    {
        rus:
            [
                [
                    {name:'Из', width:122, align:'left', type:'ro', sort:'str'},
                    {name:'Рейс №', width:72, align:'center', type:'ro', sort:'str'},
                    {name:'Авиакомпания', width:164, align:'left', type:'ro', sort:'str'},
                    {name:'Время (мск)', width:65, align:'center', type:'ro', sort:'int'},
                    {name:'#cspan', width:65, align:'center', type:'ro', sort:'int'},
                    {name:'Дни недели', width:77, align:'center', type:'ro', sort:'str'},
                    {name:'Период выполнения (с - по)', width:124, align:'center', type:'ro', sort:'int'},
                    {name:'Промеж. посадки', width:107, align:'center', type:'ro', sort:'str'},
                    {name:'Терминал во Внуково', width:94, align:'center', type:'ro', sort:'str'}
                ],
                //"#rspan,#rspan,of Departure,of Arrival,#rspan,Scheduled,Estimated,Actual,#rspan,#rspan"
                [
                    {name:'<div id="city_filtr"></div>'},
                    {name:'<div id="flight_filtr"></div>'},
                    {name:'<div id="airline_filtr"></div>'},
                    {name:'Вылета'},
                    {name:'Прилета'},
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'}
                ],
                // "#rspan,#rspan,,#rspan,#rspan,#rspan,#rspan,#rspan,#rspan,#rspan"
                [
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'}
                ]
            ],
        eng:
            [
                [
                    {name:'From', width:122, align:'left', type:'ro', sort:'str'},
                    {name:'Flight #', width:72, align:'center', type:'ro', sort:'str'},
                    {name:'Airline', width:174, align:'left', type:'ro', sort:'str'},
                    {name:'Time (MSC) of', width:65, align:'center', type:'ro', sort:'int'},
                    {name:'#cspan', width:65, align:'center', type:'ro', sort:'int'},
                    {name:'Frequency', width:77, align:'center', type:'ro', sort:'str'},
                    {name:'Valid<br/>(from - to)', width:124, align:'center', type:'ro', sort:'int'},
                    {name:'Stops', width:107, align:'center', type:'ro', sort:'str'},
                    {name:'Terminal at Vnukovo Intl.', width:94, align:'center', type:'ro', sort:'str'}
                ],
                //"#rspan,#rspan,of Departure,of Arrival,#rspan,Scheduled,Estimated,Actual,#rspan,#rspan"
                [
                    {name:'<div id="city_filtr"></div>'},
                    {name:'<div id="flight_filtr"></div>'},
                    {name:'<div id="airline_filtr"></div>'},
                    {name:'Departure'},
                    {name:'Arrival'},
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'}
                ],
                // "#rspan,#rspan,,#rspan,#rspan,#rspan,#rspan,#rspan,#rspan,#rspan"
                [
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'},
                    {name:'#rspan'}
                ]
            ]
    },

	headersNameStr: ['','',''],
	headersWidthStr: ['',''],
	headersAlignStr: ['',''],
	headersTypeStr: ['',''],
	headersSortStr: ['',''],

    selected:
        {
            'flight-search.airportId':( Ajsl.Http.getParam('airport') ? Ajsl.Http.getParam('airport') : ''),
            'flight-search.airlineId': ( Ajsl.Http.getParam('airline') ? Ajsl.Http.getParam('airline') : '' ), 
            'flight-search.flight':''
        },

	init: function()
	{
        var selY = Ajsl.Http.getParam('year');
        var selM = Ajsl.Http.getParam('month');
        var selD = Ajsl.Http.getParam('day');
		if( ( selY || selM || selD ) && !config.selectedDate ) config.selectedDate = new Date();
        if( selY ) config.selectedDate.setFullYear( selY );
        if( selM ) config.selectedDate.setMonth( selM );
        if( selD ) config.selectedDate.setDate( selD );
        if( !config.dir ) config.dir = 0;

        buildParams( this.selected )

        var delim = '', header;
				
		for( j = 0; j < this.headers[config.lang].length; j++ )
		{
			for( i = 0; i < this.headers[config.lang][j].length; i++ )
			{
				delim = ( i === 0 ) ? '' : ',';
				header = this.headers[config.lang][j][i];				
                if( j === 0 && i === 0 && config.dir === 1 ) header.name = (config.lang === 'eng') ? 'To' : 'B';
                this.headersNameStr[j] += delim + header.name;
				if( j === 0 )
				{
					this.headersWidthStr[j] += delim + header.width;
					this.headersAlignStr[j] += delim + header.align;
					this.headersTypeStr[j] += delim + header.type;
					this.headersSortStr[j] += delim + header.sort;
				}
			}
		}
    },
	getHeaderNames: function( index )
	{
		return this.headersNameStr[index];
	},
	getHeaderWidth: function( index )
	{
		return this.headersWidthStr[index];
	},
	getHeaderAligns: function( index )
	{
		return this.headersAlignStr[index];
	},
	getHeaderTypes: function( index )
	{
		return this.headersTypeStr[index];
	},
	getHeaderSort: function( index )
	{
		return this.headersSortStr[index];
	}
};

var Loading =
{
	container:null,
    show: function()
    {
        if( !this.container ) this.container = document.getElementById('gridLoading');
        if( this.container ) this.container.style.display = 'block';
    },
    hide: function() { if( this.container ) this.container.style.display = 'none'; }
};

var mygrid;
var timeoutHnd;
var flAuto = false;

function doOnLoad()
{
	mygrid = new dhtmlXGridObject('gridbox');
	mygrid.setImagePath("/media/inc/grid/img/");
	mygrid.setHeader( config.getHeaderNames(0) );
	mygrid.setInitWidths( config.getHeaderWidth(0) );
	mygrid.setColAlign( config.getHeaderAligns(0) );
	mygrid.setColTypes( config.getHeaderTypes(0) );
	//mygrid.setColSorting( config.getHeaderSort(0) );
	mygrid.setOnGridReconstructedHandler( colorizeRows );
	mygrid.setColumnMinWidth(50,0);
	mygrid.enableBuffering(30);
	mygrid.init();

	var params = {};
	//params['flight-search.airportId'] = Ajsl.Http.getParam('airport');
	//params['flight-search.airlineId'] = Ajsl.Http.getParam('airline');        
	params['flight-search.airportId'] = Ajsl.Http.getParam('airport') || Ajsl.Http.getParam('pointId') || Ajsl.Http.getParam('airportId');
	params['flight-search.airlineId'] = Ajsl.Http.getParam('airline') || Ajsl.Http.getParam('airlineId');        


    buildParams( params );
    
    loadGrid( params );
}

var request = null;

function loadGrid( params )
{	
	Loading.show();
	var allFlights = ( ( location.search.length == 0 || /direction=1|direction=0/.test( location.search ) ) && location.hash.length <= 1 );
    var defaultParams =
	{
		'flight-search.date': ( allFlights ) ? '' : ( config.selectedDate ) ? config.selectedDate.getDate()+'.'+(config.selectedDate.getMonth() + 1)+'.'+config.selectedDate.getFullYear() : '',
		//'flight-search.date': config.selectedDate.getDate()+'.'+(config.selectedDate.getMonth() + 1)+'.'+config.selectedDate.getFullYear(),
		//'flight-search.action': ( allFlights ) ? 'none' : 'search',
		'flight-search.action': 'search',
		'flight-search.dir': config.dir,
//		'day': config.selectedDate.getDate(),
//		'month': config.selectedDate.getMonth(),
//		'year': config.selectedDate.getFullYear(),
		'flight-search.airportId': '',
		'flight-search.airlineId': '',
        'flight-search.flight':'',
        'lang': ( (config.lang) ? config.lang : 'rus')
    };	

	var pathToXML = '/eng/for-passengers/time-table/data.wbp';
	if( !params ) params = {};
	for( i in defaultParams )
	{
		if( params[i] ) defaultParams[i] = params[i];
	}

	defaultParams["flight-search.airportId"] = document.shedule_v2_search.elements['flight-search.pointId'].value;
	defaultParams["flight-search.direction"] = defaultParams["flight-search.dir"];
	defaultParams["flight-search.airlineId"] = document.shedule_v2_search.elements['flight-search.airlineId'].value;
	defaultParams["flight-search.airportId"] = defaultParams["flight-search.airportId"].replace(/&gt;/, '').replace(/>/, '');
	defaultParams["flight-search.date"] = document.shedule_v2_search.elements["flight-search.date"].value;
	if (!defaultParams["flight-search.date"].length) {
		defaultParams["flight-search.date"] = document.shedule_v2_search.elements["day"].value;
		defaultParams["flight-search.date"] += "." + document.shedule_v2_search.elements["month"].value;
		defaultParams["flight-search.date"] += "." + document.shedule_v2_search.elements["year"].value;
	}

	request = new Ajsl.Http.Request( pathToXML, defaultParams );
	if( gridCache[request.url] )
	{
		setTimeout( 'buildGrid( gridCache["'+request.url+'"] )', 500 );
	}
	else
	{
        setTimeout( function()
        {
            mygrid.loadXML( '/media/inc/grid/blank.xml', function()
            {
                request.onComplete = buildGrid;
                request.send( true );
            });
        }, 500 );        
	}
}

var cityFlt, airlineFlt, flightFlt;
var citySelectBox = null;
var flightSelectBox = null;
var airlineSelectBox = null;
var SheduleCaption = null;
var gridCache = {};

function buildGrid( responce )
{
	if( !gridCache[ request.url ] ) gridCache[request.url] = responce;
	var xml = responce.getXML();
	if( !xml ) return false;
	var rows = xml.getElementsByTagName('row');
	var cells = null;

	for( i = 0; i < rows.length; i++ )
	{
		var cellsValues = [], cellsData = [];
		cells = rows[i].getElementsByTagName('cell');
		for( j = 0; j < cells.length; j++ )
		{
			try {
				cellsValues.push( cells[j].firstChild.nodeValue );
			} catch(er) {
				cellsValues.push( "" );
			}
			try {
				cellsData.push( cells[j].getAttribute('data') );
			} catch(er) {
				cellsData.push( "" );
			}
		}
		mygrid.addRow( i, cellsValues, i, cellsData );
	}

	if( !cityFlt && !airlineFlt )
	{
		mygrid.attachHeader( config.getHeaderNames(1) );
		mygrid.attachHeader( config.getHeaderNames(2) );
	}

	if( !citySelectBox ) citySelectBox = document.getElementById("city_filtr");
    if( !flightSelectBox ) flightSelectBox = document.getElementById("flight_filtr");    
    if( !airlineSelectBox ) airlineSelectBox = document.getElementById("airline_filtr");
	citySelectBox.innerHTML = flightSelectBox.innerHTML = airlineSelectBox.innerHTML = '';
	cityFlt = citySelectBox.appendChild(document.getElementById("city_filtr_box").childNodes[0].cloneNode(true));
    flightFlt = flightSelectBox.appendChild(document.getElementById("flight_filtr_box").childNodes[0].cloneNode(true));
    airlineFlt = airlineSelectBox.appendChild(document.getElementById("airline_filtr_box").childNodes[0].cloneNode(true));

	populateSelect( cityFlt, 0, config.selected[ 'flight-search.airportId' ] );
    populateSelect( flightFlt, 1, config.selected[ 'flight-search.flight' ] );    
    populateSelect( airlineFlt, 2, config.selected[ 'flight-search.airlineId' ] );

	mygrid.setSizes();
	Loading.hide();

    if( !SheduleCaption ) SheduleCaption = document.getElementById("SheduleCaption");

    var resultsType = xml.getElementsByTagName("results")[0].firstChild.nodeValue;
    var SheduleCaptionText = "По Вашему запросу найдены следующие рейсы:";
	if( config.lang == 'rus' )
	{
		switch( resultsType )
	    {
	        case 'all airlines':
	            SheduleCaptionText = "Указанный Вами в запросе город данной авиакомпанией не обслуживается.<br/>В списке приведены рейсы других авиакомпаний:";
	            break;
	        case '+/-7 days':
	            SheduleCaptionText = "В указанную в запросе дату рейсов, соответствующих параметрам запроса, не найдено.<br/>Отображен список рейсов с учетом параметров запроса, но в ближайшие 7 дней:";
	            break;
	        case 'current month':
	            SheduleCaptionText = "В указанную в запросе дату рейсов, соответствующих параметрам запроса, не найдено.<br/>Отображен список рейсов с учетом параметров запроса, но во всем текущем месяце:";
	            break;
	        case 'all schedule':
	            SheduleCaptionText = "С указанными в запросе параметрами рейсов не найдено.<br/>Отображено полное действующее расписание:";
	        case 'city':
	            SheduleCaptionText = "В указанную в запросе дату рейсов, соответствующих параметрам запроса, не найдено.<br/>Отображен список рейсов без учета даты. Обратите внимение на столбец &#8220;Период выполнения&#8221;:";
				
	            break;
	        default: break;
	    }
	    SheduleCaption.innerHTML = SheduleCaptionText;
	}    
	return true;
}

var dhtmlXGridObj = null;

function colorizeRows()
{
	if( !dhtmlXGridObj ) dhtmlXGridObj = document.getElementById('dhtmlXGridObj');
	if( !dhtmlXGridObj ) return false;
	for( i = 1, j = 1; i < dhtmlXGridObj.rows.length; i++ )
	{
		if( dhtmlXGridObj.rows[i].style.display === 'none' ) continue;
		dhtmlXGridObj.rows[i].className = ( j % 2 === 0 ) ? 'even' : 'odd';
		j++;
	}
	return true;
}

function filterBy()
{
	mygrid.clearAll( false );
	var city = citySelectBox.childNodes[0].value.toLowerCase();
	var airline = airlineSelectBox.childNodes[0].value.toLowerCase();
    var flight = flightSelectBox.childNodes[0].value;
    config.selected[ 'flight-search.airportId' ] = city;
	config.selected[ 'flight-search.airlineId' ] = airline;
    config.selected[ 'flight-search.flight' ] = flight;    
	
	setParams( config.selected );
	
    loadGrid( config.selected );    
}

function sortByName( a, b )
{
	if( a.name < b.name ) return -1;
	if( a.name > b.name ) return 1;
	return 0;
}

function populateSelect( select, index, selected )
{
	select.options.add( new Option( ( config.lang == 'eng' ? 'All' : 'Все'  ),"" ) );
	if( !dhtmlXGridObj ) dhtmlXGridObj = document.getElementById('dhtmlXGridObj');
	var used = {}, cell = null, option = null, values = [];
    var data, value;
    for( i = 1; i < dhtmlXGridObj.rows.length; i++ )
	{
		cell = dhtmlXGridObj.rows[i].cells[index];
		value = cell.innerHTML;
		data = cell.getAttribute('data');
		if( !used[ value ] )
		{
			values.push( {name:value, data:( ( data ) ? data : value )} );
			used[ value ] = true;
		}
	}
	values.sort( sortByName );
	for( i = 0; i < values.length; i++ )
	{
		option = new Option( values[i].name, values[i].data );		
		select.options.add( option );
		if( selected && selected.toUpperCase() == values[i].data.toUpperCase() ) option.selected = true;
	}
}

function setDirection( dir )
{
	var path = location.pathname;
	var query = location.search.substring(1).split('&');
	var param = '';
	if( location.search.length > 0 )
	{
		if( location.search.indexOf('direction') !== -1 )
		{
			for( i=0; i < query.length; i++ )
			{
				param = query[i].split('=');
				if( param[0] == 'direction' ) query[i] = param[0] + '=' + dir;
			}
		}
		else query.push( 'direction=' + dir );
		query = '?' + query.join('&');
	}		
	else query = '?direction=' + dir;
	
	location.href = path + query + location.hash;
    return false;
}

function setParams( params )
{
    var query = '';
    for( i in params )
    {        
        if( params[i] == '' || i == 'flight-search.flight' ) continue;
        query += ( query.length === 0 ? '#' : '&' ) + i + '=' + Ajsl.Http.escape(params[i]);
    }        

    document.shedule_v2_search.elements['flight-search.pointId'].options[0].selected = true;
    document.shedule_v2_search.elements['flight-search.airlineId'].options[0].selected = true;
    
    if( query.length == 0 )
    {
        location.href = location.href.replace( location.hash, '' ) + '#';
    }
    else location.href = location.href.replace( location.hash, '' ) + query;

    setSearchFormSelectedItem( params );
}

function getParams()
{
    var params = location.hash.substr( 1 );    
    if( params.length === 0 ) return {};
    var result = {}, param;
    params = params.split('&');
    for( i in params )
    {
        param = params[i].split('=');
        result[ param[0] ] = Ajsl.Http.unescape(param[1]);
    }

    setSearchFormSelectedItem( result );

    return result;
}

function buildParams( target )
{
    var params = getParams();
    for( i in params )
    {
        if( params[i] == '' ) continue;
        target[i] = params[i];
    }
}

function setSearchFormSelectedItem( params )
{
//    if( document.shedule_v2_search.airport.selectedIndex === 0 )
//    {
        //var items = document.shedule_v2_search.elements['flight-search.airportId'].options;
        var items = document.shedule_v2_search.elements['flight-search.pointId'].options;
        for( i=0; i < items.length; i++ )
        {
            //if( params['flight-search.airportId'] &&  items[i].value.toLowerCase() == params['flight-search.airportId'].toLowerCase() )
            if( 
				params['flight-search.airportId'] &&  items[i].value.toLowerCase() == params['flight-search.airportId'].toLowerCase() ||
				params['flight-search.pointId'] &&  items[i].value.toLowerCase() == params['flight-search.pointId'].toLowerCase() 
			)
            {
                items[i].selected = true;
                break;
            }
        }
//    }
//
//    if( document.shedule_v2_search.airline.selectedIndex === 0 )
//    {
        var items = document.shedule_v2_search.elements['flight-search.airlineId'].options;
        for( i=0; i < items.length; i++ )
        {
            //if( params['flight-search.airlineId'] && items[i].value.toLowerCase() == params['flight-search.airlineId'].toLowerCase() )
            if( params['flight-search.airlineId'] && items[i].value.toLowerCase() == params['flight-search.airlineId'].toLowerCase() )
         {
                items[i].selected = true;
                break;
            }
        }
//    }
}

function sendFormParams( form )
{
    var elem = null, params = {};
    for( i = 0; i < form.elements.length; i++ )
    {
        elem = form.elements[i];
        if( elem.value == '' || /day|month|year/.test( elem.name ) ) continue;
        params[ elem.name ] = elem.value;
    }

    setParams( params );

    mygrid.clearAll( false );
    config.selected = getParams();

    loadGrid( config.selected );
}
