Ext.BLANK_IMAGE_URL = 'http://www.dreaminsoft.com/extjs/resources/images/default/s.gif';

// application main entry point
Ext.onReady(function () {

    Ext.ux.Lightbox.register('a[rel^=lightbox]');

    // Fermo il loader e mostro la pagina
    Ext.get('loading').remove();
    Ext.get('loading-mask').fadeOut({remove: true});
    
    // Gestione dei tooltips
    Ext.QuickTips.init();
    
    // Carica la maschera ad ogni richiesta asincrona
    Ext.Ajax.on('beforerequest', showMask, mask);
    Ext.Ajax.on('requestcomplete', hideMask, mask);
    Ext.Ajax.on('requestexception', hideMask, mask);

    // Pagina
    var viewport = new Ext.Viewport({
        renderTo: Ext.getBody(),
        id: 'viewport',
        layout: 'fit',
        items: [
            {
            	id: 'page',
            	layout: 'card',
            	xtype: 'panel',
                tbar: new Ext.Toolbar({
                    items: [
                        {
                            xtype: 'box',
                            autoEl: {
                                tag: 'img',
                                height: 50,
                                alt: User.agencyName,
                                title: User.agencyName,
                                src: '/img/logos/agency_' + User.agencyId + '.png'
                            }
                        }
                    ]
                }),
            	activeItem: 0,
            	border: true,
            	style: 'background-color: white',
            	bodyStyle: 'background-color: white',
            	defaults: {
                    style: 'background-color: white',
                    bodyStyle: 'background-color: white'
            	},
            	items: [
                    {
                        id: 'listings_page',
                        xtype: 'panel',
                        layout: 'border',
                        border: false,
                        items: [
                            listingsSearchForm,
                            userListings
                        ]
                    }
		]
            }
        ]
    });

    // ********************************************************************************************
    
    // Funzione principale di ricerca immobili
    function loadListings(filtri)
    {
    	var filters = filtri ? filtri : searchParams;
        filters.action = 'read';
    	filters.agency_id = User.agencyId;
        filters.site_id = User.siteId;

    	// Lista annunci
    	userListingsStore.load({
            callback: function (r, options, success) {
                //Ext.Msg.alert("Annunci.js", r.length + " annunci trovati");
            },
            params: filters
        });
    }

    // Wrapper per la principale funzione di ricerca immobili
    function showListings()
    {
        searchParams.address = Ext.getCmp('address_filter_input').getValue();
        var pms = searchParams;

        if (searchParams.address.length)
        {
            var t = Ext.getCmp('town_filter_input');
            var town = t.getValue();
            
            if (!town)
            {
                Ext.Msg.alert('ATTENZIONE', 'Se si specifica un indirizzo, occorre specificare anche il comune nel quale lo si cerca');
                t.markInvalid('Se si specifica un indirizzo, occorre specificare anche il comune nel quale lo si cerca');
            }
            else
            {
                var currentTownId = parseInt(town);
                var currentTownName = TownsStore.getById(currentTownId).data.nome;
                var fullAddress = searchParams.address + ', ' + currentTownName + ' Italia';
                Geo.getLocationFromAddress(fullAddress, true);
            }
        }
        else
        {
            loadListings(pms);
        }
    }

    // Riporta i filtri di ricerca a quelli di default
    function resetSearchFilters()
    {
        searchParams.text        = textFilterDefault;
        searchParams.building_types = buildingTypeFilterDefault;
        searchParams.house_types = houseTypeFilterDefault;
        searchParams.floors      = floorFilterDefault;
        searchParams.min_price 	 = 0;
        searchParams.max_price 	 = maxPriceFilterDefault;
        searchParams.latitude 	 = latitudeFilterDefault;
        searchParams.longitude 	 = longitudeFilterDefault;
        searchParams.distance 	 = distanceFilterDefault;
        searchParams.address 	 = addressFilterDefault;
        searchParams.zones       = zoneFilterDefault;
        searchParams.districts	 = districtFilterDefault;
        searchParams.category_id = categoryFilterDefault;
        searchParams.contracts 	 = contractFilterDefault;
        searchParams.towns 	 = townFilterDefault;
        searchParams.mq          = squareMetersFilterDefault;
        searchParams.min_rooms   = minRoomsFilterDefault;
        searchParams.min_baths   = minBathsFilterDefault;
        
        ZonesStore.load({
            params: {
                towns: searchParams.towns
            }
        });
        
        BuildingTypesStore.load({
            params: {
                category_id: searchParams.category_id
            }
        });

        HouseTypesStore.load({
            params: {
                category_id: searchParams.category_id
            }
        });
        
        listingsSearchForm.getForm().reset();
        Ext.getCmp('building_type_filter_input_container').hide();
        Ext.getCmp('residential_filters').hide();
    }

    // Riporta i filtri a quelli di default e riavvia la ricerca
    function loadAllListings()
    {
        resetSearchFilters();
        showListings();
    }
    
    // Fa partire la ricerca degli immobili, in maniera differita
    var reSearch = new Ext.util.DelayedTask(function () {
    	loadListings(searchParams);
    });

    // La ricerca viene aggiornata se cambia il testo libero
    Ext.getCmp('listing_text_filter').on('keyup', function (obj, e) {
        var txt = obj.getValue();

        if (txt.length > 2 || !txt.length)
        {
            searchParams.text = txt;
            reSearch.delay(delayAfterFiltersChange);
        }
    });
    
    
    // Aggiorno la ricerca se cambia il tipo di contratto
    Ext.getCmp('contract_filter_input').on('select', function (combo, record, index) {
        var val = record.data.id;
        if (searchParams.contracts != val)
        {
            searchParams.contracts = record.data.id;
            showListings();
        }
    });
    
    // Aggiorno la ricerca se cambia la categoria immobiliare (residenziale/commerciale/vacanze)
    Ext.getCmp('category_filter_input').on('select', function (combo, record, index) {
        var val = record.data.id;

        if (searchParams.category_id != val)
        {
            searchParams.category_id = val;
            showListings();
        }
    });

    // Aggiorno la ricerca se cambiano le tipologie di edificio (condominio/schiera etc etc)
    Ext.getCmp('buildingtypes_filter_input').on('select', function (obj, e) {
        var val = obj.getValue();

        if (searchParams.building_types != val)
        {
            searchParams.building_types = val;
            showListings();
        }
    });

    // Aggiorno la ricerca se cambiano le tipologie di immobili (appartamento/casale/villetta etc etc)
    Ext.getCmp('housetypes_filter_input').on('select', function (obj, e) {
        var val = obj.getValue();
        
        if (searchParams.house_types != val) 
        {
            searchParams.house_types = val;
            showListings();
        }
    });

    // Aggiorno la ricerca se cambia la posizione del piano preferito (piano terra/ultimo etc etc)
    Ext.getCmp('floor_filter_input').on('select', function (obj, e) {
        var val = obj.getValue();
        
        if (searchParams.floors != val)
        {
            searchParams.floors = val;
            showListings();
        }
    });
    
    /* Aggiorno la ricerca se cambia il prezzo minimo
    Ext.getCmp('min_price_filter_input').on('keyup', function (obj, e) {
        var val = parseInt(obj.getValue());

        if (searchParams.min_price != val)
        {
            searchParams.min_price = val;
            reSearch.delay(delayAfterFiltersChange);
        }
    });
    */

    // Aggiorno la ricerca se cambia il prezzo massimo
    Ext.getCmp('max_price_filter_input').on('keyup', function (obj, e) {
        var val = parseInt(obj.getValue());
        searchParams.max_price = val ? parseInt(val) : maxPriceFilterDefault;
        reSearch.delay(delayAfterFiltersChange);
    });
    
    // Aggiorno la ricerca se cambia il numero minimo di camere
    Ext.getCmp('min_rooms_filter_input').on('keyup', function (obj, e) {
        var val = parseInt(obj.getValue());
        searchParams.min_rooms = val ? parseInt(val) : minRoomsFilterDefault;
        reSearch.delay(delayAfterFiltersChange);
    });

    // Aggiorno la ricerca se cambia il numero minimo di bagni
    Ext.getCmp('min_baths_filter_input').on('keyup', function (obj, e) {
        var val = parseInt(obj.getValue());
        searchParams.min_baths = val ? parseInt(val) : minBathsFilterDefault;
        reSearch.delay(delayAfterFiltersChange);
    });

    // Aggiorno la ricerca se cambia il comune
    Ext.getCmp('town_filter_input').on('select', function (obj, e) {
        var val = obj.getValue();
        if (searchParams.towns != val)
        {
            searchParams.towns = val;
            showListings();
        }
    });
    
    // Aggiorno la ricerca se cambiano le zone
    Ext.getCmp('zones_filter_input').on('select', function (obj, e) {
        var val = obj.getValue();
        if (searchParams.zones != val) 
        {
            searchParams.zones = val;
            showListings();
        }
    });
    
    // Aggiorno la ricerca se cambiano i quartieri
    Ext.getCmp('districts_filter_input').on('select', function (obj, e) {
        var val = obj.getValue();
        if (searchParams.districts != val) 
        {
            searchParams.districts = val;
            showListings();
        }
    });

    // Aggiorno la ricerca se si cambia la distanza (in km) dall'indirizzo civico di riferimento
    // Questa e' la combo posta nella ricerca avanzata
    Ext.getCmp('distance_filter_input').on('select', function (obj, e) {
        var val = obj.getValue();
        searchParams.distance = parseInt(val);
        showListings();
    });

    // Aggiorno la ricerca se si cambia l'indirizzo
    Ext.getCmp('address_filter_input').on('keyup', function (obj, e) {
        var val = obj.getValue();
        var currentTownId = parseInt(townFilterInput.getValue());
        var currentTown = TownsStore.getById(currentTownId);

        if (val.length && currentTown)
        {
            var currentTownName = currentTown.data.nome;
            var fullAddress = val + ', ' + currentTownName + ' Italia';
            Geo.getLocationFromAddress(fullAddress, true);
        }
    });
    
    // Pulsante per avviare la ricerca.
    // E' posto nel pannello della ricerca avanzata
    searchListingsButton.setHandler(showListings);

    // Pulsanti per azzerare tutti i filtri della ricerca, riportandoli a quelli di default
    Ext.getCmp('reset_search_listings_button').setHandler(function() {
        listingsSearchForm.getForm().reset();
        loadAllListings();
    });
    resetSearchListingsButton.setHandler(function() {
        listingsSearchForm.getForm().reset();
        loadAllListings();
    });
    
    /* MAPS ***************************************************************** */

    // Oggetto che gestisce la geolocalizzazione
    var Geo = {
        geocoder: new google.maps.Geocoder(),
        getLocationFromAddress: function (address, searchable) { // Trasforma un indirizzo geografico in coordinate
            var place = null;

            if (this.geocoder)
            {
                this.geocoder.geocode({'address': address}, function(results, status) {
                    if (status == google.maps.GeocoderStatus.OK)
                    {
                        place = results[0].geometry.location;

                        if (searchable)
                        {
                            searchParams.address = address;
                            searchParams.latitude = place.lat();
                            searchParams.longitude = place.lng();

                            reSearch.delay(delayAfterFiltersChange);
                        }
                    }
                });
            }

            return place;
        }
    };
});
