var search_controller;


function searchController()
{
    var _this= this;
    this.min_date= new Date();

    this.land_menu= new Object();

    this.land_menu[ 'all' ]= 0;
    this.land_menu[ 'Vorarlberg' ]= 8;
    this.land_menu[ 'Tirol' ]= 7;
    this.land_menu[ 'Salzburg' ]= 5;
    this.land_menu[ 'Karnten' ]= 2;
    this.land_menu[ 'Steiermark' ]= 6;
    this.land_menu[ 'Oberosterreich' ]= 4;
    this.land_menu[ 'Niederosterreich' ]= 3;
    this.land_menu[ 'Wien' ]= 9;
    this.land_menu[ 'Burgenland' ]= 1;


    this.city_cache= new Array();
    
    this.search_tab_types= [ 'Accomodation', 'SPA', 'Leisure' ];


    
    this.city_webservice= '/webserv/cityLandFilter.php?land=';

    this.options_copy= false;

    this.textbox_empty= false;
    

    this.handleOptionChange= function( event )
    {
        var sender= getEventTarget( event );
        
        var next_box= sender.parentNode.nextSibling;
        
        while( ( next_box ) && ( next_box.nodeName != 'DIV' ) )
            next_box= next_box.nextSibling;

        if( next_box )
        {
            next_box.style.display= "block";

            
            
            if( !_this.options_copy )
                _this.copyOptions( sender );
        }

        this.updateSelectboxes();
    }



    this.copyOptions= function( box )
    {
        this.options_copy= new Array();
        for( var itr= 0; itr < box.options.length; itr++ )
            this.options_copy[ box.options[ itr ].value ]= box.options[ itr ].innerHTML;
    }




    this.getSelectedOptions= function()
    {
        var result= new Array();
        var selectboxes= document.getElementsByClassName( 'roomSizeSearchSelect' );

        //console.log( selectboxes );
        
        for( var itr= 0; itr < selectboxes.length; itr++ )
            result[ selectboxes[ itr ].options[ selectboxes[ itr ].selectedIndex ].value ]= true;

        //console.log( selectboxes );

        return result;
    }

    

    this.updateSelectboxes= function()
    {
        var selected_options= this.getSelectedOptions();
        
        //console.log( selected_options );
        
        var selectboxes= document.getElementsByClassName( 'roomSizeSearchSelect' );

        for( var itr= 0; itr < selectboxes.length; itr++ )
            this.updateSelectboxOptions( selectboxes[ itr ], selected_options );
    }
    

    this.updateSelectboxOptions= function( selectbox, selected_options )
    {       
        var selected_value= selectbox.options[ selectbox.selectedIndex ].value;
        
        selectbox.options.length= 0;

        var counter= 0;



        for( var itr= 0; itr < 1; itr++ )
        {
            
            if( ( itr == 0 ) || ( !( selected_options[ itr ] ) ) ||
                ( itr == selected_value ) )
            {
                selectbox.options[ counter ]= new Option( _this.options_copy[ itr ], itr );

                if( ( itr == selected_value ) )
                    selectbox.selectedIndex= counter;
                counter++;
            }
        }
        for( var itr= 5; itr < _this.options_copy.length; itr++ )
        {
            
            if( ( itr == 0 ) || ( !( selected_options[ itr ] ) ) ||
                ( itr == selected_value ) )
            {
                selectbox.options[ counter ]= new Option( _this.options_copy[ itr ], itr );

                if( ( itr == selected_value ) )
                    selectbox.selectedIndex= counter;
                counter++;
            }
        }
        for( var itr= 1; itr < 5; itr++ )
        {
            
            if( ( itr == 0 ) || ( !( selected_options[ itr ] ) ) ||
                ( itr == selected_value ) )
            {
                selectbox.options[ counter ]= new Option( _this.options_copy[ itr ], itr );

                if( ( itr == selected_value ) )
                    selectbox.selectedIndex= counter;
                counter++;
            }
        }



    }


    this.initRoomSearchControls= function()
    {
        var selectboxes= document.getElementsByClassName( 'roomSizeSearchSelect' );
        for( var itr= 0; itr < selectboxes.length; itr++ )
        {
            addPortableEventListener(
                selectboxes[ itr ],
                'change',
                function( event ){ _this.handleOptionChange( event ); }
                );
        }
        
        
    }




    


    this.displaySearchResults= function( response )
    {
        //console.log( response );


        var matches= response.url.match( /.*\?land=([\d]+)/ );

        //console.log( matches );

        var land_id= parseInt( matches[ 1 ] );
        
        var cities= JSON.parse( response.responseText );

        this.city_cache[ land_id ]= JSON.parse( response.responseText );

        this.displayCachedCities( land_id );

    }
    

    
    this.updateCityList= function( event )
    {
        var selectbox;
        
        if( event == -1 )
            selectbox= ( document.getElementsByName( 'searchLandSelect' ) )[ 0 ];
        else
            selectbox= getEventTarget( event );


        
        var inputs= document.getElementsByName( 'searchLandSelect' );
        for( var itr= 0; itr < inputs.length; itr++ )
            if( inputs[ itr ].id != selectbox.id )
                inputs[ itr ].selectedIndex= selectbox.selectedIndex;
        
       
        
        var land_id= selectbox.options[ selectbox.selectedIndex ].value;

        if( this.city_cache[ land_id ] )
            this.displayCachedCities( land_id );

        
        advAJAX.get({
            url: _this.city_webservice+land_id,
            onSuccess: function( response ){ _this.displaySearchResults( response ) }
            });
    }


    this.bindSearchWebservice= function()
    {
        var inputs= document.getElementsByName( 'searchLandSelect' );
        for( var itr= 0; itr < inputs.length; itr++ )
        {
        addPortableEventListener(
            inputs[ itr ],
            'change',
            function( event ){ _this.updateCityList( event ) }
            );
        }
    }


    this.updateSecondDateLimit= function( old_date )
    {
        var new_date= new Date();
                    var slices= old_date.split( '.' );

                    if( slices[ 1 ][ 0 ] == '0' )
                        slices[ 1 ]= slices[ 1 ][ 1 ];
        
        
        new_date.setFullYear( parseInt( slices[ 2 ] ), parseInt( slices[ 1 ] )-1, parseInt( slices[ 0 ] ) );

        new_date.setDate( new_date.getDate()+1 );

        $('#searchDateTo').datepicker('option', 'minDate', new_date );
    }


    this.updateFirstDateLimit= function( old_date )
    {
        var new_date= new Date();
                    var slices= old_date.split( '.' );

                    if( slices[ 1 ][ 0 ] == '0' )
                        slices[ 1 ]= slices[ 1 ][ 1 ];




        new_date.setFullYear( parseInt( slices[ 2 ] ), parseInt( slices[ 1 ] )-1, parseInt( slices[ 0 ] ) );

        new_date.setDate( new_date.getDate()-1 );

        $('#searchDateFrom').datepicker('option', 'maxDate', new_date );
    }


    this.initTextSearchBox= function()
    {
        var searchbox= document.getElementById( 'inputSearchText' );
        this.textSearchBoxBlur();
        addPortableEventListener( searchbox, 'focus', function(){ _this.textSearchBoxFocus(); } );
        addPortableEventListener( searchbox, 'blur', function(){ _this.textSearchBoxBlur(); } );

/*        addPortableEventListener( searchbox.parentNode.parentNode, 'submit', function(){ _this.textSearchBoxFocus(); } );*/
    }
    


    this.textSearchBoxFocus= function()
    {
        var searchbox= document.getElementById( 'inputSearchText' );

        if( _this.textbox_empty )
        {
            searchbox.value= "";
            searchbox.style.color= "#000000";
        }
        
        
    }

    this.textSearchBoxBlur= function()
    {
        var searchbox= document.getElementById( 'inputSearchText' );

        if( searchbox.value.length == 0 )
        {
            _this.textbox_empty= true;
            searchbox.value= lang.dict[ 'textSearchLabel' ];
            searchbox.style.color= "#999999";
        }
        else
            _this.textbox_empty= false;
    }





    
    
    this.initDateSearch= function()
    {
        $("#searchDateFrom").datepicker( {
            dateFormat: 'dd.mm.yy',
            minDate: this.min_date,
            dayNames: lang.dayNames,
            dayNamesMin: lang.dayNameAbbreviations,
            monthNames: lang.monthNames,
            firstDay: lang.firstDayOfTheWeek,
            onSelect: function( old_date )
                {                
                _this.updateSecondDateLimit( old_date );
                }
            });
        $("#searchDateTo").datepicker( {
            dateFormat: 'dd.mm.yy',
            minDate: this.min_date,
            dayNames: lang.dayNames,
            dayNamesMin: lang.dayNameAbbreviations,
            monthNames: lang.monthNames,
            firstDay: lang.firstDayOfTheWeek,
            onSelect: function( old_date )
                {
                _this.updateFirstDateLimit( old_date );
                }
        });
    }


    this.selectLand= function( land_name )
    {
        var inputs= document.getElementsByName( 'searchLandSelect' );
        inputs[ 0 ].selectedIndex= this.land_menu[ land_name ];

        this.updateCityList( -1 );
        //console.log( 'Search selecting land '+ land_name );
        
    }


    this.displayCachedCities= function( land_id )
    {
        var city_selects= document.getElementsByName( 'searchCitySelect' );
        var cities= this.city_cache[ land_id ];

        for( var itr2= 0; itr2 < city_selects.length; itr2++ )
        {
            var city_select= city_selects[ itr2 ];

            //console.log( city_select );

            city_select.options.length= 0;
            city_select.options[ 0 ]= new Option( lang.dict.selectboxAllCities, 0, false, false );

            var itr= 0;
            for( var _idx in cities )
            {
                var idx= _idx.substr( 1 );
                if( parseInt( idx ) == idx )
                {
                    city_select.options[ ++itr ]= new Option( cities[ _idx ], idx, false, false );

                }
            }
        }
    }


    this.handleTabSwitch= function( event )
    {
        var sender= getEventTarget( event );
        
        for( var itr= 0; itr < this.search_tab_types.length; itr++ )
        {
            var tab_type= this.search_tab_types[ itr ]
            if( sender.rel == tab_type )
            {
                setCookieValue( 'searchControls_selectedTab', tab_type );
                
                document.getElementById( 'searchTab'+tab_type ).className= 'selectedTab';
                document.getElementById( 'searchArea'+tab_type ).className= 'selectedSearchArea';
            }
            else
            {
                document.getElementById( 'searchTab'+tab_type ).className= 'notSelectedTab';
                document.getElementById( 'searchArea'+tab_type ).className= 'notSelectedSearchArea';
            }
            
        }
        
        
    }


    this.bindSearchTabSwitcher= function()
    {
        
        for( var itr= 0; itr < this.search_tab_types.length; itr++ )
        {
            addPortableEventListener(
                document.getElementById( 'searchTab'+this.search_tab_types[ itr ] ),
                'click',
                function( event ){ _this.handleTabSwitch( event ); }
                );
        }
    }


    this.selectPreferedTab= function()
    {
        var form_type= document.getElementsByClassName( 'formType' )[ 0 ].value;

        if( form_type == 'spa' )
        {
            document.getElementById( 'searchTabSPA' ).className= 'selectedTab';
            document.getElementById( 'searchAreaSPA' ).className= 'selectedSearchArea';

            document.getElementById( 'searchTabAccomodation' ).className= 'notSelectedTab';
            document.getElementById( 'searchAreaAccomodation' ).className= 'notSelectedSearchArea';

        }
        else if( form_type == 'leisure' )
        {
            document.getElementById( 'searchTabLeisure' ).className= 'selectedTab';
            document.getElementById( 'searchAreaLeisure' ).className= 'selectedSearchArea';

            document.getElementById( 'searchTabAccomodation' ).className= 'notSelectedTab';
            document.getElementById( 'searchAreaAccomodation' ).className= 'notSelectedSearchArea';
        }
        else if( form_type == 'accomodation' )
        {
            //console.log( 'fromtype' );
        }
        else
        {
            selected_tab= getCookieValue( 'searchControls_selectedTab' );
            
            if( selected_tab == 'SPA' )
            {
                document.getElementById( 'searchTabSPA' ).className= 'selectedTab';
                document.getElementById( 'searchAreaSPA' ).className= 'selectedSearchArea';

                document.getElementById( 'searchTabAccomodation' ).className= 'notSelectedTab';
                document.getElementById( 'searchAreaAccomodation' ).className= 'notSelectedSearchArea';
            }
            else if( selected_tab == 'Leisure' )
            {
                document.getElementById( 'searchTabLeisure' ).className= 'selectedTab';
                document.getElementById( 'searchAreaLeisure' ).className= 'selectedSearchArea';

                document.getElementById( 'searchTabAccomodation' ).className= 'notSelectedTab';
                document.getElementById( 'searchAreaAccomodation' ).className= 'notSelectedSearchArea';
            }
        }


        
    }


    this.selectRoomTypes= function()
    {
        //console.log( 'selectRoomTypes' );

        
        if( document.getElementById( 'roomTypeSaved' ) )
        {
            var room_types= document.getElementById( 'roomTypeSaved' ).value.split( ',' );
            var room_counts= document.getElementById( 'roomCountSaved' ).value.split( ',' );
            
            
            var boxes= document.getElementsByClassName( 'searchSelectWrapper' );
            
            //console.log( room_types );
            //console.log( room_counts );

            var display= "none";

            var changed= 0;
            
            for( itr= boxes.length-1; itr >= 0; itr-- )
            {
                //console.log( boxes[ itr ] );
                if( room_types[ itr ] > 0 )
                {
                    var inputs= boxes[ itr ].getElementsByTagName( 'select' );

                    inputs[ 0 ].selectedIndex= room_counts[ itr ]-1;

                    tmpidx= room_types[ itr ];
                        
                    if( tmpidx < 5 )
                        tmpidx+= 8;
                    else
                        tmpidx-= 4;

                    inputs[ 1 ].selectedIndex= tmpidx;

                    display= "block";
                    changed++;
                    if( boxes[ itr+1 ] )
                        boxes[ itr+1 ].style.display= "block";
                }

                
                boxes[ itr ].style.display= display;
                

            // poor debugging you, whoever you are... know one thing - I'm sorry ;)
            }

            if( changed == 0 )
                boxes[ 0 ].style.display= "block";
        }
        
    }





    this.selectPreferedTab();


    this.bindSearchWebservice();
    this.initDateSearch();
    this.initRoomSearchControls();
    this.initTextSearchBox();
    this.bindSearchTabSwitcher();


    this.selectRoomTypes();

//     if( !_this.options_copy )
    this.copyOptions( document.getElementsByClassName( 'roomSizeSearchSelect' )[ 0 ] );

    this.updateSelectboxes();
    return this;
}


function initSearchControls()
{
    var tested= document.getElementById( 'inputSearchText' );
    if( tested )
        search_controller= new searchController();
}













runOnLoad( initSearchControls );

