Ox.load.Geo = function(options, callback) {

    Ox.getJSON(Ox.PATH + 'Ox.Geo/json/Ox.Geo.json', function(data) {

        //@ Constants ----------------------------------------------------------

        /*@
        Ox.COUNTRIES <[o]> Array of countries
            A list of independent (or de-facto independent) countries and
            dependencies (see
            <a href="http://en.wikipedia.org/wiki/List_of_sovereign_states">Wikipedia</a>),
            other entities with
            <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO 3166-1 alpha-2</a>
            country codes, and former countries according to <a href="http://en.wikipedia.org/wiki/ISO_3166-3">ISO 3166-3</a>
            and <a href="http://www.imdb.com/country/">IMDb</a>.
            area <n> Area of the country in square meters
            code <s> ISO 3166-1 alpha-2 country code
            dependencies <[s]> Array of dependencies of the country
            dependency <[s]> Array of countries the country is a dependency of
            disputed <[s]> Array of countries the country is disputed by
            disputes <[s]> Array of countries the country disputes
            dissolved <[s]> Array of countries the country has been dissolved (merged, renamed or split) into 
            east <n> Longitude of eastern boundary in deg
            googleName <s|u> Google Maps country name
            imdbCode <s|u> IMDb country code
            imdbName <s|u> IMDb country name
            languages <[s]> Array of languages that are spoken in this country more than in any other
            lat <n> Latitude of the center in deg
            lng <n> Longitude of the center in deg
            name <s> Name
            north <n> Latitude of northern boundary in deg
            other <b> True if the country is an "other entity" (EU, FX, UK)
            south <n> Latitude of southern boundary in deg
            wikipediaURL <s> URL of the wikipedia article for the country
            west <n> Longitude of western boundary in deg
            <script>
                Ox.test.array = [
                    // Current independent countries with dependencies
                    Ox.COUNTRIES.filter(function(c) {
                        return c.dependencies.length && !c.dissolved.length && !c.other;
                    }).length,
                    // Current independent countries with (fixme: not necessarily current) disputes
                    Ox.COUNTRIES.filter(function(c) {
                        return c.disputes.length && !c.dissolved.length && !c.other;
                    }).length,
                    // Current independent countries without dependencies or disputes
                    Ox.COUNTRIES.filter(function(c) {
                        return !c.dependencies.length && !c.dependency.length
                            && !c.disputes.length && !c.disputed.length
                            && !c.dissolved.length && !c.other;
                    }).length,
                    // Current dependent countries
                    Ox.COUNTRIES.filter(function(c) {
                        return c.dependency.length && !c.dissolved.length && !c.other;
                    }).length,
                    // Current disputed countries
                    Ox.COUNTRIES.filter(function(c) {
                        return c.disputed.length && !c.dissolved.length && !c.other;
                    }).length,
                    // Former independent countries with dependencies
                    Ox.COUNTRIES.filter(function(c) {
                        return c.dependencies.length && c.dissolved.length && !c.other;
                    }).length,
                    // Former independent countries with disputes
                    Ox.COUNTRIES.filter(function(c) {
                        return c.disputes.length && c.dissolved.length && !c.other;
                    }).length,
                    // Former independent countries without dependencies or disputes
                    Ox.COUNTRIES.filter(function(c) {
                        return !c.dependencies.length && !c.dependency.length
                            && !c.disputes.length && !c.disputed.length
                            && c.dissolved.length && !c.other;
                    }).length,
                    // Former dependect countries
                    Ox.COUNTRIES.filter(function(c) {
                        return c.dependency.length && c.dissolved.length && !c.other;
                    }).length,
                    // Former disputed countries
                    Ox.COUNTRIES.filter(function(c) {
                        return c.disputed.length && c.dissolved.length && !c.other;
                    }).length,
                    // Other entities
                    Ox.COUNTRIES.filter(function(c) { return c.other; }).length
                ];
            </script>
            > Ox.COUNTRIES.length
            311
            > Ox.sum(Ox.test.array)
            311
            > Ox.test.array
            [13, 8, 176, 73, 7, 1, 0, 16, 13, 1, 3]
        @*/

        Ox.COUNTRIES = data;

        //@ Functions ----------------------------------------------------------

        /*@
        Ox.getCountryByCode <f> Returns a country object for a given country code
            (code) -> <o> Country object
            code <s> ISO 3166 country code
            > Ox.getCountryByCode('US').name
            'United States'
        @*/

        Ox.getCountryByCode = function(code) {
            var country;
            Ox.forEach(Ox.COUNTRIES, function(c) {
                if (c.code == code) {
                    country = c;
                    return false;
                }
            });
            return country;
        };

        /*@
        Ox.getCountryByGeoname <f> Returns a country object for a given geoname
            (name) -> <o> Country object
            name <s> Geoname
            > Ox.getCountryByGeoname('Los Angeles, California, United States').code
            'US'
            > Ox.getCountryByGeoname('The Bottom, Saba, Bonaire, Saint Eustatius and Saba').code
            'BQ'
        @*/

        Ox.getCountryByGeoname = function(geoname) {
            // fixme: UAE correction doesn't belong here, fix in map
            geoname = geoname.replace(' - United Arab Emirates', ', United Arab Emirates')
            return Ox.getCountryByName(
                geoname.split(', ').pop()
                .replace('Saint Eustatius', 'Bonaire, Saint Eustatius')
            );
        }

        /*@
        Ox.getCountryByName <f> Returns a country object for a given country name
            (name) -> <o> Country object
            name <s> Country name
            > Ox.getCountryByName('United States').code
            'US'
            > Ox.getCountryByName('USA').code
            'US'
        @*/

        Ox.getCountryByName = function(name) {
            var country;
            Ox.forEach(Ox.COUNTRIES, function(c) {
                if (name == c.name || name == c.googleName || name == c.imdbName) {
                    country = c;
                    return false;
                }
            });
            return country;
        };

        /*@
        Ox.getImageByGeoname <f> Returns an image URL for a given geoname
            (type, size, geoname) -> <s> Image URL
            type <s> Image type ('flag' or 'icon')
            size <n> Image width (32, 256, 2048 (flag), 16, 256, 1024 (icon))
            geoname <s> Geoname
        @*/

        Ox.getImageByGeoname = function(type, size, geoname) {
            var country = Ox.getCountryByGeoname(geoname),
                code = country ? country.code : 'NTHH';
            return Ox.PATH + 'Ox.Geo/png/' + type + 's/' + size + '/' + code + '.png';
        };

        /*@
        Ox.getImageByLanguage <f> Returns an image URL for a given language
            (type, size, geoname) -> <s> Image URL
            type <s> Image type ('flag' or 'icon')
            size <n> Image width (32, 256, 2048 (flag), 16, 256, 1024 (icon))
            language <s> Language
        @*/

        Ox.getImageByLanguage = function(type, size, language) {
            language = language
                .replace(' languages', '')
                .replace(' Sign Language', '');
            var country = '', code;
            Ox.COUNTRIES.forEach(function(c) {
                if (c.languages.indexOf(language) > -1) {
                    country = c;
                    return false;
                }
            });
            code = country ? country.code : 'NTHH';
            return Ox.PATH + 'Ox.Geo/png/' + type + 's/' + size + '/' + code + '.png';
        };

        callback(true);

    });

}