function GeoForm(form) {
    SearchFormClass.init = function() {
        FlashMap.containerId = 'map-for-location';
        FlashMap.preventLoading();

        $('#address').bind('change',{},function(){return SearchFormClass.changeAddress();});

        // If we have start positions for region and/or area,
        // we have to load Lat/Lng positions
        coords = SearchFormClass.form.find('#locality').attr('alt');
        if (coords) {
            coords = coords.split(';');
            if (coords.length>0) {
                var options = SearchFormClass.form.find('#locality option');
                $.each(coords,function(index,item){
                    options.eq(index+1).attr('alt',item);
                });
            }
        }
    };

    SearchFormClass.initAutocomplete = function() {
        params   = {limit: 25};
        $.each(SearchFormClass.settings.levels.list, function(index,level){
            value = $('#' + level).val();
            if (SearchFormClass.settings.emptyElement != value) {
                params[level] = value;
            }
        });

        // Choose Italy in each case
        // params['country'] = 109;

        // Change params of autocompleter
        console.log(params)
        SearchFormClass.autocomplete.setOptions({params: params});
    };

    SearchFormClass.eraseTownAndAddress = function() {
        $('#town, #address').val('');
    }

    // Not necessary
    SearchFormClass.predefineCounty = function() {
        return ;
    }

    searchForm = SearchForm(form, {
        settings: {
            emptyElement: '0',
            defaultOption: function(){return '<option value="--">' + Lang._('- select -') + '</option>';},
            levels: {
                callback: {
                    country: function(data) {
                        SearchFormClass.setCurrentPoint({lat: data.country.lat, lng: data.country.lng});
                        Geo.panMapTo({lat: data.country.lat, lng: data.country.lng, zoom: 6});

                        SearchFormClass.eraseTownAndAddress();
                    },
                    region: function(data) {
                        SearchFormClass.setCurrentPoint({lat: data.region.lat, lng: data.region.lng});
                        Geo.panMapTo({lat: data.region.lat, lng: data.region.lng, zoom: 8});

                        SearchFormClass.eraseTownAndAddress();
                    },
                    province: function(data) {
                        SearchFormClass.setCurrentPoint({lat: data.province.lat, lng: data.province.lng});
                        Geo.panMapTo({lat: data.province.lat, lng: data.province.lng, zoom: 10});

                        SearchFormClass.eraseTownAndAddress();
                    },
                    locality: function(data) {
                        SearchFormClass.setCurrentPoint({lat: data.locality.lat, lng: data.locality.lng});
                        Geo.panMapTo({lat: data.locality.lat, lng: data.locality.lng, zoom: 11});

                        SearchFormClass.eraseTownAndAddress();
                    },
                    town: function(data) {
                        SearchFormClass.setCurrentPoint({lat: data.lat, lng: data.lng});
                        Geo.panMapTo({lat: data.lat, lng: data.lng, zoom: 12});

                        $('#address').val('');
                    }
                }
            },

            flashMap : {
                // Selector for getting flash map
                containerId: 'home-map-container'
            }
        },

        isGeo: true,

        lock: function() {

        }
    });

    searchForm = $.extend(true, searchForm, {
        // List of selectboxes objects
        selectBoxes: {
            'country'  : null,
            'region'   : null,
            'province' : null,
            'locality' : null
        },

        startPlaceCoords: {
            'lat': 0,
            'lng': 0
        },

        rememberStartPlace: function(lat, lng) {
            SearchFormClass.startPlaceCoords = {
                'lat': lat,
                'lng': lng
            };
        },

        isPlaceChanged: function() {
            return !($('#lat').val() == SearchFormClass.startPlaceCoords.lat
                && $('#lng').val() == SearchFormClass.startPlaceCoords.lng);
        },

        setAddress: function(address) {
            $('#address').val(address);
        },

        // Return current point via lat,lng,zoom options
        getCurrentPoint: function() {
            country  = $('#country').val();
            region   = $('#region').val();
            province = $('#province').val();
            locality = $('#locality').val();
            town     = $('#town').val();
            address  = $('#address').val();

            lat = $('#lat').val();
            lng = $('#lng').val();
            zoom = 2;

            if(country == 0) {
                // Show all Europe
                zoom = 4;
            } else {
                if (region == 0) {
                    // Show one full country
                    zoom = 6;
                } else {
                    // Show one region
                    zoom = 8;
                    // Show one administrative area
                    if (locality) {zoom = 10;}
                    // Show city
                    if (town && town.length>1) {zoom = 11;}
                    // Show street
                    if (address && address.length>1) {zoom = 16;}
                }
            }

            return {lat: lat, lng: lng, zoom: zoom};
        },

        setCurrentPoint: function(point) {
            $('#lat').val(point.lat);
            $('#lng').val(point.lng);

            SearchFormClass.lock();
            SearchFormClass.getElevation(point.lat, point.lng, function(elevation){
                SearchFormClass.unlock();
                $('#height').val(elevation);
            });
        },

        changeAddress: function() {
            town    = $('#town').val();
            address = $('#address').val();
            // If nothing to check..
            if (!town || !address) {
                return this;
            }

            // Get full address for geocoding
            country = $('#country option:selected').text();
            region  = $('#region  option:selected').text();
            address = country + ' ' + region + ' ' + town + ' ' + address;

            // Call geocoder service and give callback function
            // to the callback we get GPoint object
            Geo.geocodeAddress(address, function(gpoint){
                Geo.panMapTo({lat: gpoint.lat(), lng: gpoint.lng(), zoom: 16});
                SearchFormClass.setCurrentPoint({lat: gpoint.lat(), lng: gpoint.lng()});
            });
        },

        // More information for Google Elevation Service:
        // http://code.google.com/apis/maps/documentation/javascript/services.html#Elevation
        getElevation: function(lat, lng, callback) {
            var elevator  = new google.maps.ElevationService();
            var callback = callback;
            // Create a LocationElevationRequest object using the array's one value
            var positionalRequest = {
                'locations': [new google.maps.LatLng(lat, lng)]
            }

            // Initiate the location request
            elevator.getElevationForLocations(positionalRequest, function(results, status) {
                if (status == google.maps.ElevationStatus.OK) {
                    // Retrieve the first result
                    if (results[0]) {
                        callback(Math.round(results[0].elevation));
                    } else {
                        callback(0);
                    }
                } else {
                    callback(0);
                }
            });
        }
    });

    searchForm.rememberStartPlace($('#lat').val(), $('#lng').val());

    return searchForm;
}


