    
var geoLocateAddress = function () {
    var public = {};
    
    public.init = function() {
        public.initEventHandlers();
    };
    
    public.initEventHandlers = function() {
        $("#findMyLocation").click(function() {
            if (!navigator.geolocation) {
                console.log("GeoLocation not supported, using IP");
                public.loadAddressByIP();
            }
            else {
                console.log("Using your browser's GeoLocation API");
                navigator.geolocation.getCurrentPosition(
                    public.loadAddressByGeolocation);
            }
        });    
    };
    
    public.loadAddressByGeolocation = function(position) {
        console.dir(position);
    
        if ("undefined" !== typeof position.address) {    
            public.updateAddressFields({
                city : position.address.city,

            });
        } else {
            console.log("Your browser only returns Long/Lat");      
            public.loadAddressByLngLat(position);
        }    
    };    
    
    public.loadAddressByLngLat = function(position){
        var data = {
            lat : position.coords.latitude,
            lng : position.coords.longitude
        };
        var url = "http://ws.geonames.org/findNearestAddressJSON";
        $.ajax({
            url: url,
            dataType: 'jsonp',
            data: data,
            success: function(data, textStatus, xhr) {
                public.updateAddressFields({
                    city : data.address.placename+", "+data.address.adminCode1,

                });
            },
            error: function(xhr, textStatus, errorThrown) {
                console.log(textStatus);
            }
        });
        
        return false;
    };
          
    public.loadAddressByIP = function() {
        $.getJSON("http://www.geoplugin.net/json.gp?jsoncallback=?", 
            function (data) {
                public.updateAddressFields({
                    city : data.geoplugin_city,
                    stateCode: data.geoplugin_regionCode,
                    countryCode: data.geoplugin_countryCode
                });        
            });  
    };
    
    public.updateAddressFields = function(address) {
        console.dir(address);
        
        console.log('City: ' + address.city);
        $("#city").val(address.city);
        
        var stateCode = address.stateCode;
        if (!stateCode) {
            stateCode = $("#state option:contains('" + 
                address.state + "')").attr('value');            
        }

    };    

    return public;
} ();

geoLocateAddress.init();
