diff --git a/demo/static/OxJS/dev/Ox.Geo/Ox.Geo.js b/demo/static/OxJS/dev/Ox.Geo/Ox.Geo.js new file mode 100644 index 0000000..510c50f --- /dev/null +++ b/demo/static/OxJS/dev/Ox.Geo/Ox.Geo.js @@ -0,0 +1,264 @@ +'use strict'; + +Ox.load.Geo = function(options, callback) { + + Ox.getJSON(Ox.PATH + 'Ox.Geo/json/Ox.Geo.json?' + Ox.VERSION, function(data) { + + //@ Constants + + /*@ + Ox.COUNTRIES <[o]> Array of countries + A list of independent or de-facto independent countries and + dependencies since January 1, 1970 (see + Wikipedia), + including other entities with + ISO 3166-1 alpha-2 + country codes or country status at + IMDb or + FIFA, + grouped by continents and regions (see + United Nations). + area Area of the country's bounding box in square meters + code ISO 3166-1 alpha-2, ISO 3166-2 or ISO 3166-3 country code + continent The country's continent + created Present if the country was created since 1970 + country <[s]> Preceding country or countries + created "merged", "renamed" or "split" + date Date of creation ("YYYY" or "YYYY-MM-DD") + dependencies <[s]|u> Array of dependencies of the country + dependency <[s]|u> Array of countries the country is a dependency of + disputed <[s]|u> Array of countries the country is disputed by + disputes <[s]|u> Array of countries the country disputes + dissolved Present if the country was dissolved + country <[s]> Succeeding country or countries + date Date of dissolution ("YYYY" or "YYYY-MM-DD") + dissolved "joined", "merged" or "renamed" + east Longitude of the country's eastern boundary + exception True for exceptionally reserved ISO 3166-1 alpha-2 codes + (like "AC", "EU" or "UK") + flagURL The country's flag (Wikipedia, SVG) + googleName The country's name according to Google Maps + imdbName The country's name according to IMDb + independence Present if the country became independent since 1970 + country <[s]> Former country or countries + date Date of independence ("YYYY" or "YYYY-MM-DD") + languages <[s]|u> Array of languages spoken in this country + To be precise: languages that are spoken in this country more + than in any other, i.e. each language only appears once. This + can be used to map languages to flag icons. + lat Latitude of the center of the country's bounding box + lng Longitude of the center of the country's bounding box + name Name of the country + north Latitude of the country's northern boundary + region The country's region + south Latitude of the country's southern boundary + wikipediaName The country's name according to Wikipedia + west Longitude of the country's western boundary + + > Ox.COUNTRIES.length + 354 + > Ox.sum(Ox.test.array) + 354 + > Ox.test.array + [196, 73, 10, 8, 28, 24, 14, 1] + @*/ + + Ox.COUNTRIES = data; + Ox.GEO_COLORS = { + + 'North America': [0, 0, 255], + 'Northern America': [0, 0, 255], + + 'South America': [0, 255, 0], + 'Southern America': [0, 255, 0], + 'Caribbean': [192, 255, 192], + 'Central America': [0, 128, 0], + + 'Europe': [255, 255, 0], + 'Western Europe': [255, 255, 0], + 'Northern Europe': [255, 255, 192], + 'Southern Europe': [128, 128, 0], + 'Eastern Europe': [255, 192, 0], + + 'Africa': [255, 0, 255], + 'Northern Africa': [255, 0, 255], + 'Southern Africa': [255, 128, 255], + 'Middle Africa': [128, 0, 128], + 'Western Africa': [128, 0, 255], + 'Eastern Africa': [255, 0, 128], + + 'Asia': [255, 0, 0], + 'Eastern Asia': [255, 0, 0], + 'South-Eastern Asia': [255, 128, 128], + 'Southern Asia': [128, 0, 0], + 'Western Asia': [255, 128, 0], + 'Central Asia': [128, 64, 0], + + 'Oceania': [0, 255, 255], + 'Australia and New Zealand': [0, 255, 255], + 'Micronesia': [192, 255, 255], + 'Melanesia': [0, 128, 128], + 'Polynesia': [128, 128, 255], + + 'Antarctica': [128, 128, 128] + + }; + + //@ Functions + + /*@ + Ox.getCountryByCode Returns a country object for a given country code + (code) -> Country object + code ISO 3166 country code + > Ox.getCountryByCode('US').name + 'United States' + @*/ + Ox.getCountryByCode = Ox.getCountryByCountryCode = function(code) { + var country; + code = code.toUpperCase(); + Ox.forEach(Ox.COUNTRIES, function(c) { + if (c.code == code) { + country = c; + return false; // break + } + }); + return country; + }; + + /*@ + Ox.getCountryByGeoname Returns a country object for a given geoname + (name) -> Country object + name Geoname + > Ox.getCountryByGeoname('Los Angeles, California, United States').code + 'US' + > Ox.getCountryByGeoname('The Bottom, Saba, Bonaire, Sint 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('Sint Eustatius and Saba', 'Bonaire, Sint Eustatius and Saba') + .replace('Ascension and Tristan da Cunha', 'Saint Helena, Ascension and Tristan da Cunha') + ); + } + + /*@ + Ox.getCountryByName Returns a country object for a given country name + (name) -> Country object + name 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; // break + } + }); + return country; + }; + + /*@ + Ox.getFlagByCountryCode Returns an image URL for a given country code + (code[, size]) -> Image URL + code Country code (like 'FR') + size Image size (16, 64 or 256) + @*/ + Ox.getFlagByCountryCode = function(code, size) { + var country = Ox.getCountryByCode(code); + code = country ? country.code : 'NTHH'; + size = size || 16; + return Ox.PATH + 'Ox.Geo/png/flags/' + size + '/' + code + '.png'; + }; + + /*@ + Ox.getFlagByGeoname Returns an image URL for a given geoname + (geoname[, size]) -> Image URL + geoname Geoname (like 'France' or 'Paris, France') + size Image size (16, 64 or 256) + @*/ + Ox.getFlagByGeoname = function(geoname, size) { + var country = Ox.getCountryByGeoname(geoname), + code = country ? country.code : 'NTHH'; + size = size || 16; + return Ox.PATH + 'Ox.Geo/png/flags/' + size + '/' + code + '.png'; + }; + + /*@ + Ox.getFlagByLanguage Returns an image URL for a given language + (language[, size]) -> Image URL + language Language (like "French") + size Image size (16, 64 or 256) + @*/ + Ox.getFlagByLanguage = function(language, size) { + var country, code; + language = language.toLowerCase() + .replace(' languages', '') + .replace(' sign language', ''); + Ox.COUNTRIES.forEach(function(c) { + if (c.languages && c.languages.map(function(language) { + return language.toLowerCase(); + }).indexOf(language) > -1) { + country = c; + return false; // break + } + }); + code = country ? country.flag || country.code : 'NTHH'; + return Ox.PATH + 'Ox.Geo/png/flags/' + size + '/' + code + '.png'; + }; + + /*@ + Ox.getGeoColor Returns a color for a continent or region + (str) -> RGB + str Continent or region + @*/ + Ox.getGeoColor = function(str) { + return Ox.GEO_COLORS[str] || [128, 128, 128]; + }; + + callback(true); + + }); + +} diff --git a/demo/static/OxJS/dev/Ox.Geo/json/Ox.Geo.json b/demo/static/OxJS/dev/Ox.Geo/json/Ox.Geo.json new file mode 100644 index 0000000..585df13 --- /dev/null +++ b/demo/static/OxJS/dev/Ox.Geo/json/Ox.Geo.json @@ -0,0 +1,7326 @@ +[ + { + "area": 175767626.27131784, + "code": "AC", + "continent": "Africa", + "dependency": [ + "Saint Helena, Ascension and Tristan da Cunha" + ], + "east": -14.2892646, + "exception": true, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/0/09/Ascension_Island_flag_proposal_B.png", + "lat": -7.9467166, + "lng": -14.3559158, + "name": "Ascension", + "north": -7.8876128, + "region": "Western Africa", + "south": -7.9942974, + "west": -14.4235038, + "wikipediaName": "Ascension Island" + }, + { + "area": 783355889.3382671, + "code": "AD", + "continent": "Europe", + "east": 1.786639, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/19/Flag_of_Andorra.svg", + "lat": 42.546245, + "lng": 1.601554, + "name": "Andorra", + "north": 42.655791, + "region": "Southern Europe", + "south": 42.4287632, + "west": 1.4087181 + }, + { + "area": 190384162117.00742, + "code": "AE", + "continent": "Asia", + "created": { + "country": [ + "Abu Dhabi", + "Ajman", + "Dubai", + "Fujairah", + "Sharjah", + "Umm al-Quwain" + ], + "created": "merged", + "date": "1971-12-02" + }, + "east": 56.4053766, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/c/cb/Flag_of_the_United_Arab_Emirates.svg", + "lat": 23.424076, + "lng": 53.847818, + "name": "United Arab Emirates", + "north": 26.0696541, + "region": "Western Asia", + "south": 22.6315138, + "west": 51.4997702 + }, + { + "area": 5633926847.122248, + "code": "AE-AJ", + "continent": "Asia", + "created": { + "country": [ + "Trucial States" + ], + "created": "merged", + "date": "1971-12-01" + }, + "dissolved": { + "country": [ + "United Arab Emirates" + ], + "date": "1971-12-02", + "dissolved": "merged" + }, + "east": 56.1267431, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/07/Flag_of_Dubai.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1971-12-01" + }, + "lat": 25.4052165, + "lng": 55.5136433, + "name": "Ajman", + "north": 25.4501956, + "region": "Western Asia", + "south": 24.73617, + "west": 55.4236511 + }, + { + "area": 133976873888.98026, + "code": "AE-AZ", + "continent": "Asia", + "created": { + "country": [ + "Trucial States" + ], + "created": "merged", + "date": "1971-12-01" + }, + "dissolved": { + "country": [ + "United Arab Emirates" + ], + "date": "1971-12-02", + "dissolved": "merged" + }, + "east": 56.023933, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d8/Flag_of_Abu_Dhabi.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1971-12-01" + }, + "lat": 23.4677235, + "lng": 53.7369154, + "name": "Abu Dhabi", + "north": 25.246815, + "region": "Western Asia", + "south": 22.6319311, + "west": 51.4997702 + }, + { + "area": 11057979120.389898, + "code": "AE-DU", + "continent": "Asia", + "created": { + "country": [ + "Trucial States" + ], + "created": "merged", + "date": "1971-12-01" + }, + "dissolved": { + "country": [ + "United Arab Emirates" + ], + "date": "1971-12-02", + "dissolved": "merged" + }, + "east": 56.211487, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/07/Flag_of_Dubai.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1971-12-01" + }, + "lat": 24.9821547, + "lng": 55.402868, + "name": "Dubai", + "north": 25.3538421, + "region": "Western Asia", + "south": 24.605052, + "west": 54.8967829 + }, + { + "area": 3515325446.7377033, + "code": "AE-FU", + "continent": "Asia", + "created": { + "country": [ + "Trucial States" + ], + "created": "merged", + "date": "1971-12-01" + }, + "dissolved": { + "country": [ + "United Arab Emirates" + ], + "date": "1971-12-02", + "dissolved": "merged" + }, + "east": 56.3760899, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/c/cb/Flag_of_the_United_Arab_Emirates.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1971-12-01" + }, + "lat": 25.4110762, + "lng": 56.2482277, + "name": "Fujairah", + "north": 25.667782, + "region": "Western Asia", + "south": 24.907855, + "west": 55.96323 + }, + { + "area": 7552878633.56744, + "code": "AE-RK", + "continent": "Asia", + "created": { + "country": [ + "Trucial States" + ], + "created": "merged", + "date": "1971-12-01" + }, + "dissolved": { + "country": [ + "United Arab Emirates" + ], + "date": "1972-02-11", + "dissolved": "joined" + }, + "east": 56.297054, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/6d/Flag_of_Sharjah.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1971-12-01" + }, + "lat": 25.5675233, + "lng": 55.8913207, + "name": "Ras al-Khaimah", + "north": 26.0788481, + "region": "Western Asia", + "south": 24.834166, + "west": 55.75471 + }, + { + "area": 8351635081.128588, + "code": "AE-SH", + "continent": "Asia", + "created": { + "country": [ + "Trucial States" + ], + "created": "merged", + "date": "1971-12-01" + }, + "dissolved": { + "country": [ + "United Arab Emirates" + ], + "date": "1971-12-02", + "dissolved": "merged" + }, + "east": 56.381176, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/6d/Flag_of_Sharjah.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1971-12-01" + }, + "lat": 25.0753974, + "lng": 55.7578403, + "name": "Sharjah", + "north": 25.5135598, + "region": "Western Asia", + "south": 24.7916701, + "west": 55.349777, + "wikipediaName": "Sharjah (emirate)" + }, + { + "area": 1705010012.9681716, + "code": "AE-UQ", + "continent": "Asia", + "created": { + "country": [ + "Trucial States" + ], + "created": "merged", + "date": "1971-12-01" + }, + "dissolved": { + "country": [ + "United Arab Emirates" + ], + "date": "1971-12-02", + "dissolved": "merged" + }, + "east": 55.953869, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/fb/Flag_of_Umm_al-Qaiwain.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1971-12-01" + }, + "lat": 25.5204824, + "lng": 55.7133909, + "name": "Umm al-Quwain", + "north": 25.6733149, + "region": "Western Asia", + "south": 25.323967, + "west": 55.5175201 + }, + { + "area": 1345340995552.5718, + "code": "AF", + "continent": "Asia", + "east": 74.8898619, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/9a/Flag_of_Afghanistan.svg", + "languages": [ + "Pashtu", + "Dari" + ], + "lat": 33.93911, + "lng": 67.709953, + "name": "Afghanistan", + "north": 38.4908767, + "region": "Southern Asia", + "south": 29.3772, + "west": 60.5170005 + }, + { + "area": 6507807256.075687, + "code": "AG", + "continent": "South America", + "east": -61.6574192, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/89/Flag_of_Antigua_and_Barbuda.svg", + "lat": 17.060816, + "lng": -61.796428, + "name": "Antigua and Barbuda", + "north": 17.729564, + "region": "Caribbean", + "south": 16.9325319, + "west": -62.347657 + }, + { + "area": 2656822148.5968294, + "code": "AI", + "continent": "South America", + "created": { + "country": [ + "Saint Christopher-Nevis-Anguilla" + ], + "created": "merged", + "date": "1983-09-19" + }, + "dependency": [ + "United Kingdom" + ], + "east": -62.9224348, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/b4/Flag_of_Anguilla.svg", + "lat": 18.220554, + "lng": -63.068615, + "name": "Anguilla", + "north": 18.5955719, + "region": "Caribbean", + "south": 18.1499463, + "west": -63.4293939 + }, + { + "area": 35807592588.87033, + "code": "AIDJ", + "continent": "Africa", + "dependency": [ + "France" + ], + "dissolved": { + "country": [ + "Djibouti" + ], + "date": "1977-06-27", + "dissolved": "renamed" + }, + "east": 43.4169731, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/c/c3/Flag_of_France.svg", + "lat": 11.825138, + "lng": 42.590275, + "name": "French Afar and Issas", + "north": 12.7133956, + "region": "Eastern Africa", + "south": 10.9319442, + "west": 41.7597221, + "wikipediaName": "French Territory of the Afars and the Issas" + }, + { + "area": 50466764872.140465, + "code": "AL", + "continent": "Europe", + "east": 21.0572394, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/36/Flag_of_Albania.svg", + "languages": [ + "Albanian" + ], + "lat": 41.153332, + "lng": 20.168331, + "name": "Albania", + "north": 42.6610819, + "region": "Southern Europe", + "south": 39.6447296, + "west": 19.2639041 + }, + { + "area": 74364226651.78856, + "code": "AM", + "continent": "Asia", + "created": { + "country": [ + "Soviet Union" + ], + "created": "split", + "date": "1991-09-23" + }, + "east": 46.634222, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/2f/Flag_of_Armenia.svg", + "languages": [ + "Armenian" + ], + "lat": 40.069099, + "lng": 45.038189, + "name": "Armenia", + "north": 41.300993, + "region": "Western Asia", + "south": 38.840244, + "west": 43.4472118 + }, + { + "area": 467596462541.78906, + "code": "ANHH", + "continent": "South America", + "dependency": [ + "Netherlands" + ], + "dissolved": { + "country": [ + "Bonaire, Sint Eustatius and Saba", + "Cura\u00e7ao", + "Sint Maarten" + ], + "date": "2010-10-10", + "dissolved": "split" + }, + "east": -62.9228, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/92/Flag_of_the_Netherlands_Antilles_%281986-2010%29.svg", + "lat": 12.2248767, + "lng": -68.8108849, + "name": "Netherlands Antilles", + "north": 18.0516, + "region": "Caribbean", + "south": 11.9224, + "west": -69.299 + }, + { + "area": 2055207622038.109, + "code": "AO", + "continent": "Africa", + "disputes": [ + "Cabinda" + ], + "east": 24.0844443, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/9d/Flag_of_Angola.svg", + "independence": { + "country": [ + "Portugal" + ], + "date": "1975-11-11" + }, + "lat": -11.202692, + "lng": 17.873887, + "name": "Angola", + "north": -4.3879444, + "region": "Middle Africa", + "south": -18.039104, + "west": 11.669562 + }, + { + "area": 104997033.29673876, + "code": "AO-CAB", + "continent": "Africa", + "created": { + "country": [ + "Portugal" + ], + "created": "split", + "date": "1975-08-01" + }, + "disputed": [ + "Angola" + ], + "dissolved": { + "country": [ + "Angola" + ], + "date": "1975-11-11", + "dissolved": "joined" + }, + "east": 12.2682953, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/22/Flag_of_Cabinda.svg", + "lat": -5.556549, + "lng": 12.18984, + "name": "Cabinda", + "north": -5.5409834, + "region": "Middle Africa", + "south": -5.6216234, + "west": 12.1627235 + }, + { + "area": 33291563518969.44, + "code": "AQ", + "continent": "Antarctica", + "dependency": [ + "Argentina", + "Australia", + "Chile", + "France", + "New Zealand", + "Norway", + "United Kingdom" + ], + "east": 179.9999999999, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/68/Flag_of_the_Antarctic_Treaty.svg", + "lat": -72.5255643899, + "lng": 0, + "name": "Antarctica", + "north": -60, + "region": "Antarctica", + "south": -85.0511287798, + "west": -179.9999999999 + }, + { + "area": 6346680075284.267, + "code": "AR", + "continent": "South America", + "dependencies": [ + "Argentine Antarctica", + "Antarctica" + ], + "east": -53.637481, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/1a/Flag_of_Argentina.svg", + "lat": -38.416097, + "lng": -63.616672, + "name": "Argentina", + "north": -21.7808136, + "region": "Southern America", + "south": -55.0577146, + "west": -73.5603601 + }, + { + "area": 4531351701195.581, + "code": "AR-AQ", + "continent": "Antarctica", + "dependency": [ + "Argentina" + ], + "east": -25, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/01/Flag_of_Tierra_del_Fuego_province_in_Argentina.svg", + "lat": -72.5255643899, + "lng": -49.5, + "name": "Argentine Antarctica", + "north": -60, + "region": "Antarctica", + "south": -85.0511287798, + "west": -74 + }, + { + "area": 3900152374.8784447, + "code": "AS", + "continent": "Oceania", + "dependency": [ + "United States" + ], + "east": -169.4185568, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/87/Flag_of_American_Samoa.svg", + "lat": -14.305941, + "lng": -170.6962002, + "name": "American Samoa", + "north": -14.1551045, + "region": "Polynesia", + "south": -14.3824778, + "west": -170.8468222 + }, + { + "area": 168518540127.9662, + "code": "AT", + "continent": "Europe", + "east": 17.1607489, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/41/Flag_of_Austria.svg", + "lat": 47.516231, + "lng": 14.550072, + "name": "Austria", + "north": 49.0206081, + "region": "Western Europe", + "south": 46.372299, + "west": 9.5307834 + }, + { + "area": 21533004061653.816, + "code": "AU", + "continent": "Oceania", + "dependencies": [ + "Ashmore and Cartier Islands", + "Australian Antarctic Territory", + "Christmas Island", + "Cocos Islands", + "Coral Sea Islands", + "Heard Island and McDonald Islands", + "Norfolk Island", + "Antarctica" + ], + "east": 159.105459, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/b/b9/Flag_of_Australia.svg", + "languages": [ + "Aboriginal", + "Australian", + "Gunwinggu" + ], + "lat": -25.274398, + "lng": 133.775136, + "name": "Australia", + "north": -9.2210836, + "region": "Australia and New Zealand", + "south": -54.7772185, + "west": 112.9214544 + }, + { + "area": 552499290234.8615, + "code": "AU-AC", + "continent": "Oceania", + "dependency": [ + "Australia" + ], + "east": 127.6312338, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/b/b9/Flag_of_Australia.svg", + "lat": -12.5333333, + "lng": 123.5333333, + "name": "Ashmore and Cartier Islands", + "north": -9.7309344, + "region": "Australia and New Zealand", + "south": -15.3055948, + "west": 119.4354328 + }, + { + "area": 10668713086967.64, + "code": "AU-AQ", + "continent": "Antarctica", + "dependency": [ + "Australia" + ], + "east": 160, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/b/b9/Flag_of_Australia.svg", + "lat": -72.5255643899, + "lng": 102.3166666667, + "name": "Australian Antarctic Territory", + "north": -60, + "region": "Antarctica", + "south": -85.0511287798, + "west": 44.6333333333 + }, + { + "area": 7533838341216.605, + "code": "AU-CS", + "continent": "Oceania", + "dependency": [ + "Australia" + ], + "east": 169.8124453, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/b/b9/Flag_of_Australia.svg", + "lat": -19.3919547, + "lng": 155.8560646, + "name": "Coral Sea Islands", + "north": -7.5286054, + "region": "Australia and New Zealand", + "south": -30.0000002, + "west": 141.0550345, + "wikipediaName": "Coral Sea Islands Territory" + }, + { + "area": 512368143.2744644, + "code": "AW", + "continent": "South America", + "created": { + "country": [ + "Netherlands Antilles" + ], + "created": "split", + "date": "1986-01-01" + }, + "dependency": [ + "Netherlands" + ], + "east": -69.86588, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/f6/Flag_of_Aruba.svg", + "lat": 12.52111, + "lng": -69.968338, + "name": "Aruba", + "north": 12.6233784, + "region": "Caribbean", + "south": 12.4117656, + "west": -70.0660256 + }, + { + "area": 13862996517.973103, + "code": "AX", + "continent": "Europe", + "dependency": [ + "Finland" + ], + "east": 21.4858534, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/5/52/Flag_of_%C3%85land.svg", + "lat": 60.3385485, + "lng": 20.2712585, + "name": "\u00c5land Islands", + "north": 60.7411127, + "region": "Northern Europe", + "south": 59.7272227, + "west": 19.2633194 + }, + { + "area": 186807274085.63242, + "code": "AZ", + "continent": "Asia", + "created": { + "country": [ + "Soviet Union" + ], + "created": "split", + "date": "1991-08-30" + }, + "disputes": [ + "Nagorno-Karabakh" + ], + "east": 50.3680657, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/dd/Flag_of_Azerbaijan.svg", + "languages": [ + "Azerbaijani" + ], + "lat": 40.143105, + "lng": 47.576927, + "name": "Azerbaijan", + "north": 41.9123402, + "region": "Western Asia", + "south": 38.3919901, + "west": 44.7646831 + }, + { + "area": 8726630575.197157, + "code": "AZ-NK", + "continent": "Asia", + "disputed": [ + "Azerbaijan" + ], + "east": 47.1954658, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/8d/Flag_of_Nagorno-Karabakh.svg", + "lat": 40.1263658, + "lng": 46.5008174, + "name": "Nagorno-Karabakh", + "north": 40.4144162, + "region": "Western Asia", + "south": 39.4456576, + "west": 46.2474941, + "wikipediaName": "Nagorno-Karabakh Republic" + }, + { + "area": 94681777434.67616, + "code": "BA", + "continent": "Europe", + "created": { + "country": [ + "Yugoslavia" + ], + "created": "split", + "date": "1992-03-01" + }, + "east": 19.621935, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/bf/Flag_of_Bosnia_and_Herzegovina.svg", + "languages": [ + "Bosnian" + ], + "lat": 43.915886, + "lng": 17.679076, + "name": "Bosnia and Herzegovina", + "north": 45.2766262, + "region": "Southern Europe", + "south": 42.5564068, + "west": 15.7223665 + }, + { + "area": 808358096.5728474, + "code": "BB", + "continent": "South America", + "east": -59.4200975, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/ef/Flag_of_Barbados.svg", + "lat": 13.193887, + "lng": -59.543198, + "name": "Barbados", + "north": 13.335126, + "region": "Caribbean", + "south": 13.0449995, + "west": -59.6510303 + }, + { + "area": 311553243410.7361, + "code": "BD", + "continent": "Asia", + "created": { + "country": [ + "Pakistan" + ], + "created": "split", + "date": "1971-12-16" + }, + "east": 92.6801153, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/f9/Flag_of_Bangladesh.svg", + "languages": [ + "Bengali" + ], + "lat": 23.684994, + "lng": 90.356331, + "name": "Bangladesh", + "north": 26.6342434, + "region": "Southern Asia", + "south": 20.7543802, + "west": 88.0085887 + }, + { + "area": 61144636854.214005, + "code": "BE", + "continent": "Europe", + "east": 6.4081241, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/65/Flag_of_Belgium.svg", + "languages": [ + "Flemish" + ], + "lat": 50.503887, + "lng": 4.469936, + "name": "Belgium", + "north": 51.5051449, + "region": "Western Europe", + "south": 49.497013, + "west": 2.5449406 + }, + { + "area": 546016014803.1511, + "code": "BF", + "continent": "Africa", + "created": { + "country": [ + "Upper Volta" + ], + "created": "renamed", + "date": "1984-08-04" + }, + "east": 2.4042926, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/31/Flag_of_Burkina_Faso.svg", + "languages": [ + "More" + ], + "lat": 12.238333, + "lng": -1.561593, + "name": "Burkina Faso", + "north": 15.0851111, + "region": "Western Africa", + "south": 9.3938888, + "west": -5.5211114 + }, + { + "area": 169561070289.8746, + "code": "BG", + "continent": "Europe", + "east": 28.6075898, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/9a/Flag_of_Bulgaria.svg", + "languages": [ + "Bulgarian" + ], + "lat": 42.733883, + "lng": 25.48583, + "name": "Bulgaria", + "north": 44.2151673, + "region": "Eastern Europe", + "south": 41.2354469, + "west": 22.3559007 + }, + { + "area": 3699913281.9765654, + "code": "BH", + "continent": "Asia", + "east": 50.8228639, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/2c/Flag_of_Bahrain.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1971-12-16" + }, + "lat": 26.0667, + "lng": 50.5577, + "name": "Bahrain", + "north": 26.3265283, + "region": "Western Asia", + "south": 25.5798401, + "west": 50.3781509 + }, + { + "area": 49389727203.80458, + "code": "BI", + "continent": "Africa", + "east": 30.8501728, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/5/50/Flag_of_Burundi.svg", + "lat": -3.373056, + "lng": 29.918886, + "name": "Burundi", + "north": -2.309987, + "region": "Eastern Africa", + "south": -4.4692284, + "west": 29.000993 + }, + { + "area": 231377534721.0831, + "code": "BJ", + "continent": "Africa", + "created": { + "country": [ + "Dahomey" + ], + "created": "renamed", + "date": "1975-11-30" + }, + "east": 3.8433429, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/0a/Flag_of_Benin.svg", + "lat": 9.30769, + "lng": 2.315834, + "name": "Benin", + "north": 12.4086111, + "region": "Western Africa", + "south": 6.2356319, + "west": 0.7766672 + }, + { + "area": 130170840.36823143, + "code": "BL", + "continent": "South America", + "dependency": [ + "France" + ], + "east": -62.7892148, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/c/c3/Flag_of_France.svg", + "lat": 17.9, + "lng": -62.833333, + "name": "Saint Barth\u00e9lemy", + "north": 17.960853, + "region": "Caribbean", + "south": 17.8708287, + "west": -62.9118453 + }, + { + "area": 361672833.23584133, + "code": "BM", + "continent": "North America", + "dependency": [ + "United Kingdom" + ], + "east": -64.6473774, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/bf/Flag_of_Bermuda.svg", + "lat": 32.3078, + "lng": -64.7505, + "name": "Bermuda", + "north": 32.391305, + "region": "Northern America", + "south": 32.24705, + "west": -64.886788 + }, + { + "area": 16615065722.487818, + "code": "BN", + "continent": "Asia", + "east": 115.3635623, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/9c/Flag_of_Brunei.svg", + "googleName": "Brunei Darussalam", + "imdbName": "Brunei Darussalam", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1984-01-01" + }, + "lat": 4.535277, + "lng": 114.727669, + "name": "Brunei", + "north": 5.0471668, + "region": "South-Eastern Asia", + "south": 4.002508, + "west": 114.0760633 + }, + { + "area": 1914088188060.917, + "code": "BO", + "continent": "South America", + "east": -57.453803, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/de/Flag_of_Bolivia_%28state%29.svg", + "languages": [ + "Aymara" + ], + "lat": -16.290154, + "lng": -63.588653, + "name": "Bolivia", + "north": -9.669323, + "region": "Southern America", + "south": -22.8980899, + "west": -69.64499 + }, + { + "area": 411198929182.0769, + "code": "BQ", + "continent": "South America", + "created": { + "country": [ + "Netherlands Antilles" + ], + "created": "merged", + "date": "2010-10-10" + }, + "dependency": [ + "Netherlands" + ], + "east": -62.9457768, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/1e/Flag_of_Bonaire.svg", + "lat": 15.1657632, + "lng": -65.68337005, + "name": "Bonaire, Sint Eustatius and Saba", + "north": 18.3069449, + "region": "Caribbean", + "south": 12.0245815, + "west": -68.4209633, + "wikipediaName": "Caribbean Netherlands" + }, + { + "area": 5548593919831.322, + "code": "BQAQ", + "continent": "Antarctica", + "dependency": [ + "United Kingdom" + ], + "east": -20, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/fd/Flag_of_the_British_Antarctic_Territory.svg", + "lat": -72.5255643899, + "lng": -50, + "name": "British Antarctic Territory", + "north": -60, + "region": "Antarctica", + "south": -85.0511287798, + "west": -80 + }, + { + "area": 18016100144861.344, + "code": "BR", + "continent": "South America", + "east": -34.792908, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/0/05/Flag_of_Brazil.svg", + "languages": [ + "Tupi", + "Brazilian" + ], + "lat": -14.235004, + "lng": -51.92528, + "name": "Brazil", + "north": 5.2716019, + "region": "Southern America", + "south": -33.7517528, + "west": -73.982817 + }, + { + "area": 490185328604.69745, + "code": "BS", + "continent": "South America", + "east": -72.7120686, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/93/Flag_of_the_Bahamas.svg", + "googleName": "The Bahamas", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1973-07-10" + }, + "lat": 25.03428, + "lng": -77.39628, + "name": "Bahamas", + "north": 27.263362, + "region": "Caribbean", + "south": 20.9121311, + "west": -79.5377959, + "wikipediaName": "The Bahamas" + }, + { + "area": 61586519695.02172, + "code": "BT", + "continent": "Asia", + "east": 92.1252321, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/91/Flag_of_Bhutan.svg", + "lat": 27.514162, + "lng": 90.433601, + "name": "Bhutan", + "north": 28.360825, + "region": "Southern Asia", + "south": 26.702016, + "west": 88.7464735 + }, + { + "area": 1987185942406.8538, + "code": "BUMM", + "continent": "Asia", + "dissolved": { + "country": [ + "Myanmar" + ], + "date": "1989-06-18", + "dissolved": "renamed" + }, + "east": 101.1702717, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/1d/Flag_of_Myanmar_%281974-2010%29.svg", + "languages": [ + "Burmese" + ], + "lat": 21.913965, + "lng": 95.956223, + "name": "Burma", + "north": 28.5478351, + "region": "South-Eastern Asia", + "south": 9.6053198, + "west": 92.171808 + }, + { + "area": 68205327.80421972, + "code": "BV", + "continent": "Antarctica", + "dependency": [ + "Norway" + ], + "east": 3.4879756, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d9/Flag_of_Norway.svg", + "lat": -54.423199, + "lng": 3.413194, + "name": "Bouvet Island", + "north": -54.400322, + "region": "Antarctica", + "south": -54.4623789, + "west": 3.335499 + }, + { + "area": 980095616844.6542, + "code": "BW", + "continent": "Africa", + "east": 29.3753036, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/fa/Flag_of_Botswana.svg", + "lat": -22.328474, + "lng": 24.684866, + "name": "Botswana", + "north": -17.778137, + "region": "Southern Africa", + "south": -26.9075451, + "west": 19.998905 + }, + { + "area": 345533040726.3922, + "code": "BY", + "continent": "Europe", + "created": { + "country": [ + "Byelorussian Soviet Socialist Republic" + ], + "created": "renamed", + "date": "1991-08-25" + }, + "east": 32.7768202, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/85/Flag_of_Belarus.svg", + "independence": { + "country": [ + "Soviet Union" + ], + "date": "1991-08-25" + }, + "languages": [ + "Belarusian" + ], + "lat": 53.709807, + "lng": 27.953389, + "name": "Belarus", + "north": 56.172494, + "region": "Eastern Europe", + "south": 51.262011, + "west": 23.1783377 + }, + { + "area": 345533040726.3922, + "code": "BYAA", + "continent": "Europe", + "dependency": [ + "Soviet Union" + ], + "dissolved": { + "country": [ + "Belarus" + ], + "date": "1991-08-25", + "dissolved": "renamed" + }, + "east": 32.7768202, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/46/Flag_of_Byelorussian_SSR.svg", + "lat": 53.709807, + "lng": 27.953389, + "name": "Byelorussian Soviet Socialist Republic", + "north": 56.172494, + "region": "Eastern Europe", + "south": 51.262011, + "west": 23.1783377 + }, + { + "area": 54811369908.70548, + "code": "BZ", + "continent": "South America", + "created": { + "country": [ + "British Honduras" + ], + "created": "renamed", + "date": "1973-06-01" + }, + "east": -87.4537253, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/e7/Flag_of_Belize.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1973-06-01" + }, + "lat": 17.189877, + "lng": -88.49765, + "name": "Belize", + "north": 18.4959419, + "region": "Central America", + "south": 15.8856189, + "west": -89.2275879 + }, + { + "area": 20574297060671.438, + "code": "CA", + "continent": "North America", + "east": -52.6194086, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/c/cf/Flag_of_Canada.svg", + "languages": [ + "Cree", + "Nisga'a" + ], + "lat": 56.130366, + "lng": -106.346771, + "name": "Canada", + "north": 83.115061, + "region": "Northern America", + "south": 41.6765559, + "west": -141.00187 + }, + { + "area": 536938084.815205, + "code": "CC", + "continent": "Asia", + "dependency": [ + "Australia" + ], + "east": 96.9300556, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/7/74/Flag_of_the_Cocos_%28Keeling%29_Islands.svg", + "googleName": "Cocos (Keeling) Islands", + "imdbName": "Cocos (Keeling) Islands", + "lat": -12.1707796, + "lng": 96.8417392, + "name": "Cocos Islands", + "north": -11.8219891, + "region": "South-Eastern Asia", + "south": -12.2088942, + "west": 96.8155574, + "wikipediaName": "Cocos (Keeling) Islands" + }, + { + "area": 4437461670331.977, + "code": "CD", + "continent": "Africa", + "created": { + "country": [ + "Zaire" + ], + "created": "renamed", + "date": "1997-05-17" + }, + "east": 31.3146115, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/6f/Flag_of_the_Democratic_Republic_of_the_Congo.svg", + "imdbName": "Democratic Republic of Congo", + "languages": [ + "Lingala" + ], + "lat": -4.038333, + "lng": 21.758664, + "name": "Democratic Republic of the Congo", + "north": 5.3920026, + "region": "Middle Africa", + "south": -13.459035, + "west": 12.1855092 + }, + { + "area": 1411025431928.9167, + "code": "CF", + "continent": "Africa", + "east": 27.4583051, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/6f/Flag_of_the_Central_African_Republic.svg", + "lat": 6.611111, + "lng": 20.939444, + "name": "Central African Republic", + "north": 11.0179569, + "region": "Middle Africa", + "south": 2.2208575, + "west": 14.4150981 + }, + { + "area": 810512052374.2054, + "code": "CG", + "continent": "Africa", + "east": 18.6436111, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/92/Flag_of_the_Republic_of_the_Congo.svg", + "googleName": "Congo", + "imdbName": "Congo", + "lat": -0.228021, + "lng": 15.827659, + "name": "Republic of the Congo", + "north": 3.707791, + "region": "Middle Africa", + "south": -5.0289487, + "west": 11.1495478 + }, + { + "area": 76574669332.10374, + "code": "CH", + "continent": "Europe", + "east": 10.4923401, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/08/Flag_of_Switzerland_%28Pantone%29.svg", + "languages": [ + "Romansh", + "Swiss German" + ], + "lat": 46.818188, + "lng": 8.227512, + "name": "Switzerland", + "north": 47.8084546, + "region": "Western Europe", + "south": 45.81792, + "west": 5.95608 + }, + { + "area": 479232148086.64526, + "code": "CI", + "continent": "Africa", + "east": -2.493031, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/86/Flag_of_Cote_d%27Ivoire.svg", + "googleName": "Ivory Coast", + "lat": 7.539989, + "lng": -5.54708, + "name": "C\u00f4te d'Ivoire", + "north": 10.7400151, + "region": "Western Africa", + "south": 4.3510071, + "west": -8.6020589, + "wikipediaName": "Ivory Coast" + }, + { + "area": 1327046744594.7834, + "code": "CK", + "continent": "Oceania", + "dependency": [ + "New Zealand" + ], + "east": -157.3216064, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/35/Flag_of_the_Cook_Islands.svg", + "lat": -21.236736, + "lng": -159.777671, + "name": "Cook Islands", + "north": -8.916606, + "region": "Polynesia", + "south": -21.9591364, + "west": -165.8580933 + }, + { + "area": 16138765657013.834, + "code": "CL", + "continent": "South America", + "dependencies": [ + "Chilean Antarctic Territory", + "Antarctica" + ], + "east": -66.4182016, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/7/78/Flag_of_Chile.svg", + "languages": [ + "Mapudungun" + ], + "lat": -35.675147, + "lng": -71.542969, + "name": "Chile", + "north": -17.4983293, + "region": "Southern America", + "south": -55.9797808, + "west": -109.454801 + }, + { + "area": 3421632917229.316, + "code": "CL-AQ", + "continent": "Antarctica", + "dependency": [ + "Chile" + ], + "east": -53, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/8d/Flag_of_Magallanes%2C_Chile.svg", + "lat": -72.5255643899, + "lng": -71.5, + "name": "Chilean Antarctic Territory", + "north": -60, + "region": "Antarctica", + "south": -85.0511287798, + "west": -90 + }, + { + "area": 1079541457211.6615, + "code": "CM", + "continent": "Africa", + "east": 16.1944079, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/4f/Flag_of_Cameroon.svg", + "lat": 7.369722, + "lng": 12.354722, + "name": "Cameroon", + "north": 13.083335, + "region": "Middle Africa", + "south": 1.6558999, + "west": 8.4947635 + }, + { + "area": 21444604637248.695, + "code": "CN", + "continent": "Asia", + "dependencies": [ + "Hong Kong", + "Macau" + ], + "east": 134.7728099, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/fa/Flag_of_the_People%27s_Republic_of_China.svg", + "languages": [ + "Mandarin", + "Hakka", + "Cantonese", + "Tibetan", + "Chinese", + "Chaozhou", + "Shanghainese", + "Hokkien", + "Naxi", + "Shanxi", + "Min Nan", + "Uighur" + ], + "lat": 35.86166, + "lng": 104.195397, + "name": "China", + "north": 53.560974, + "region": "Eastern Asia", + "south": 18.1535216, + "west": 73.4994136 + }, + { + "area": 3227545859888.26, + "code": "CO", + "continent": "South America", + "east": -66.851923, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/21/Flag_of_Colombia.svg", + "lat": 4.570868, + "lng": -74.297333, + "name": "Colombia", + "north": 13.3973501, + "region": "Southern America", + "south": -4.22711, + "west": -81.7359299 + }, + { + "area": 12998110.19815648, + "code": "CP", + "continent": "South America", + "dependency": [ + "France" + ], + "east": -109.1993179, + "exception": true, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/c/c3/Flag_of_France.svg", + "lat": 10.284842, + "lng": -109.2162498, + "name": "Clipperton Island", + "north": 10.3134499, + "region": "Central America", + "south": 10.2820702, + "west": -109.2332915 + }, + { + "area": 318414348310.5174, + "code": "CR", + "continent": "South America", + "east": -82.5526571, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/bc/Flag_of_Costa_Rica_%28state%29.svg", + "lat": 9.748917, + "lng": -83.753428, + "name": "Costa Rica", + "north": 11.2196808, + "region": "Central America", + "south": 5.4991534, + "west": -87.0945131 + }, + { + "area": 280640895305.775, + "code": "CSHH", + "continent": "Europe", + "dissolved": { + "country": [ + "Czech Republic", + "Slovakia" + ], + "date": "1993-01-01", + "dissolved": "split" + }, + "east": 22.5589339, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/c/cb/Flag_of_the_Czech_Republic.svg", + "lat": 49.39355365, + "lng": 17.32476145, + "name": "Czechoslovakia", + "north": 51.0557185, + "region": "Eastern Europe", + "south": 47.7313888, + "west": 12.090589 + }, + { + "area": 176788955025.32986, + "code": "CSXX", + "continent": "Europe", + "created": { + "country": [ + "Yugoslavia" + ], + "created": "renamed", + "date": "2003-02-04" + }, + "dissolved": { + "country": [ + "Serbia", + "Montenegro" + ], + "date": "2006-06-05", + "dissolved": "split" + }, + "east": 23.0063915, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/90/Flag_of_Serbia_and_Montenegro.svg", + "imdbName": "Federal Republic of Yugoslavia", + "lat": 44.01958135, + "lng": 20.7200918, + "name": "Serbia and Montenegro", + "north": 46.1894461, + "region": "Southern Europe", + "south": 41.8497166, + "west": 18.4337921 + }, + { + "area": 3073356240.6199794, + "code": "CTKI", + "continent": "Oceania", + "dependency": [ + "United Kingdom", + "United States" + ], + "dissolved": { + "country": [ + "Kiribati" + ], + "date": "1979-07-12", + "dissolved": "merged" + }, + "east": -171.075486, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/4d/Flag_of_Gilbert_and_Ellice_Islands.svg", + "lat": -2.955756, + "lng": -171.39963095, + "name": "Canton and Enderbury Islands", + "north": -2.7642201, + "region": "Micronesia", + "south": -3.1472919, + "west": -171.7237759 + }, + { + "area": 435017353019.0518, + "code": "CU", + "continent": "South America", + "east": -74.1322231, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/bd/Flag_of_Cuba.svg", + "lat": 21.521757, + "lng": -77.781167, + "name": "Cuba", + "north": 23.2767521, + "region": "Caribbean", + "south": 19.8258994, + "west": -85.071256 + }, + { + "area": 77368961930.72092, + "code": "CV", + "continent": "Africa", + "east": -22.6577782, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/38/Flag_of_Cape_Verde.svg", + "independence": { + "country": [ + "Portugal" + ], + "date": "1975-07-05" + }, + "languages": [ + "Kabuverdianu", + "Kriolu" + ], + "lat": 15.1217288, + "lng": -23.6050817, + "name": "Cape Verde", + "north": 17.2052865, + "region": "Western Africa", + "south": 14.8023513, + "west": -25.3609944 + }, + { + "area": 2622894061.474846, + "code": "CW", + "continent": "South America", + "created": { + "country": [ + "Netherlands Antilles" + ], + "created": "merged", + "date": "2010-10-10" + }, + "dependency": [ + "Netherlands" + ], + "east": -68.6398315, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/b1/Flag_of_Cura%C3%A7ao.svg", + "lat": 12.16957, + "lng": -68.99002, + "name": "Cura\u00e7ao", + "north": 12.3924356, + "region": "Caribbean", + "south": 11.9780353, + "west": -69.1623668 + }, + { + "area": 344624352.6729794, + "code": "CX", + "continent": "Asia", + "dependency": [ + "Australia" + ], + "east": 105.7126474, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/67/Flag_of_Christmas_Island.svg", + "lat": -10.447525, + "lng": 105.690449, + "name": "Christmas Island", + "north": -10.4123743, + "region": "South-Eastern Asia", + "south": -10.5700879, + "west": 105.5333161 + }, + { + "area": 25433013804.42087, + "code": "CY", + "continent": "Asia", + "disputes": [ + "Northern Cyprus" + ], + "east": 34.6045, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d4/Flag_of_Cyprus.svg", + "lat": 35.126413, + "lng": 33.429859, + "name": "Cyprus", + "north": 35.7071999, + "region": "Western Asia", + "south": 34.632303, + "west": 32.2687076 + }, + { + "area": 14756720233.830664, + "code": "CY-NC", + "continent": "Asia", + "disputed": [ + "Cyprus" + ], + "east": 34.5883512, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/1e/Flag_of_the_Turkish_Republic_of_Northern_Cyprus.svg", + "lat": 35.32864295, + "lng": 33.594625, + "name": "Northern Cyprus", + "north": 35.6958526, + "region": "Western Asia", + "south": 34.9614333, + "west": 32.6008988 + }, + { + "area": 135538457364.93378, + "code": "CZ", + "continent": "Europe", + "created": { + "country": [ + "Czechoslovakia" + ], + "created": "merged", + "date": "1993-01-01" + }, + "east": 18.8592361, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/c/cb/Flag_of_the_Czech_Republic.svg", + "languages": [ + "Czech" + ], + "lat": 49.817492, + "lng": 15.472962, + "name": "Czech Republic", + "north": 51.0557185, + "region": "Eastern Europe", + "south": 48.5518081, + "west": 12.090589 + }, + { + "area": 176094999206.0812, + "code": "DDDE", + "continent": "Europe", + "dissolved": { + "country": [ + "Germany" + ], + "date": "1990-10-03", + "dissolved": "merged" + }, + "east": 15.0418962, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/f6/Flag_of_German_Democratic_Republic.svg", + "lat": 52.42802665, + "lng": 12.4594401, + "name": "East Germany", + "north": 54.68469, + "region": "Western Europe", + "south": 50.1713633, + "west": 9.876984 + }, + { + "area": 554893218804.3876, + "code": "DE", + "continent": "Europe", + "created": { + "country": [ + "East Germany", + "West Germany" + ], + "created": "merged", + "date": "1990-10-03" + }, + "east": 15.0418962, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/b/ba/Flag_of_Germany.svg", + "languages": [ + "German", + "Eastern Frisian", + "Sorbian", + "Low German" + ], + "lat": 51.165691, + "lng": 10.451526, + "name": "Germany", + "north": 55.058347, + "region": "Western Europe", + "south": 47.2701115, + "west": 5.8663425 + }, + { + "area": 482186388933.63434, + "code": "DEDE", + "continent": "Europe", + "dissolved": { + "country": [ + "Germany" + ], + "date": "1990-10-03", + "dissolved": "merged" + }, + "east": 13.8396371, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/b/ba/Flag_of_Germany.svg", + "lat": 51.16422925, + "lng": 9.8529898, + "name": "West Germany", + "north": 55.058347, + "region": "Western Europe", + "south": 47.2701115, + "west": 5.8663425 + }, + { + "area": 362584546.5342261, + "code": "DG", + "continent": "Asia", + "dependency": [ + "British Indian Ocean Territory" + ], + "east": 72.4943804, + "exception": true, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/6e/Flag_of_the_British_Indian_Ocean_Territory.svg", + "lat": -7.3195005, + "lng": 72.4228556, + "name": "Diego Garcia", + "north": -7.2332526, + "region": "Southern Asia", + "south": -7.4435391, + "west": 72.3540901 + }, + { + "area": 35807592588.87033, + "code": "DJ", + "continent": "Africa", + "created": { + "country": [ + "French Afar and Issas" + ], + "created": "renamed", + "date": "1977-06-27" + }, + "east": 43.4169731, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/34/Flag_of_Djibouti.svg", + "independence": { + "country": [ + "France" + ], + "date": "1977-06-27" + }, + "lat": 11.825138, + "lng": 42.590275, + "name": "Djibouti", + "north": 12.7133956, + "region": "Eastern Africa", + "south": 10.9319442, + "west": 41.7597221 + }, + { + "area": 156971442579.48773, + "code": "DK", + "continent": "Europe", + "dependencies": [ + "Faroe Islands", + "Greenland" + ], + "east": 15.1972813, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/9c/Flag_of_Denmark.svg", + "languages": [ + "Danish" + ], + "lat": 56.26392, + "lng": 9.501785, + "name": "Denmark", + "north": 57.7518131, + "region": "Northern Europe", + "south": 54.5591211, + "west": 8.0725589 + }, + { + "area": 1237179673.7944572, + "code": "DM", + "continent": "South America", + "east": -61.2403035, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/c/c4/Flag_of_Dominica.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1978-11-03" + }, + "lat": 15.414999, + "lng": -61.370976, + "name": "Dominica", + "north": 15.6400639, + "region": "Caribbean", + "south": 15.207682, + "west": -61.4798301 + }, + { + "area": 106440578993.17665, + "code": "DO", + "continent": "South America", + "east": -68.3234068, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/9f/Flag_of_the_Dominican_Republic.svg", + "lat": 18.735693, + "lng": -70.162651, + "name": "Dominican Republic", + "north": 19.9317185, + "region": "Caribbean", + "south": 17.4700909, + "west": -72.0075099 + }, + { + "area": 231377534721.0831, + "code": "DYBJ", + "continent": "Africa", + "dissolved": { + "country": [ + "Benin" + ], + "date": "1975-11-30", + "dissolved": "renamed" + }, + "east": 3.8433429, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/0a/Flag_of_Benin.svg", + "lat": 9.30769, + "lng": 2.315834, + "name": "Dahomey", + "north": 12.4086111, + "region": "Western Africa", + "south": 6.2356319, + "west": 0.7766672, + "wikipediaName": "Republic of Dahomey" + }, + { + "area": 4079600969545.9604, + "code": "DZ", + "continent": "Africa", + "east": 11.9999997, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/7/77/Flag_of_Algeria.svg", + "languages": [ + "Tamashek" + ], + "lat": 28.033886, + "lng": 1.659626, + "name": "Algeria", + "north": 37.089829, + "region": "Northern Africa", + "south": 18.968147, + "west": -8.6666671 + }, + { + "area": 16168736425.77416, + "code": "EA", + "continent": "Africa", + "dependency": [ + "Spain" + ], + "east": -2.9232245, + "exception": true, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/fd/Flag_Ceuta.svg", + "lat": 35.5917321, + "lng": -4.152717, + "name": "Ceuta and Melilla", + "north": 35.9179899, + "region": "Northern Africa", + "south": 35.2654743, + "west": -5.3822095, + "wikipediaName": "Ceuta" + }, + { + "area": 1390937132987.864, + "code": "EC", + "continent": "South America", + "east": -75.188794, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/e8/Flag_of_Ecuador.svg", + "lat": -1.831239, + "lng": -78.183406, + "name": "Ecuador", + "north": 1.6647727, + "region": "Southern America", + "south": -5.0143511, + "west": -92.0107728 + }, + { + "area": 91158981019.11528, + "code": "EE", + "continent": "Europe", + "created": { + "country": [ + "Soviet Union" + ], + "created": "split", + "date": "1991-08-20" + }, + "east": 28.2101389, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/8f/Flag_of_Estonia.svg", + "languages": [ + "Estonian" + ], + "lat": 58.595272, + "lng": 25.013607, + "name": "Estonia", + "north": 59.7001935, + "region": "Northern Europe", + "south": 57.5093155, + "west": 21.7643126 + }, + { + "area": 1302913144530.2227, + "code": "EG", + "continent": "Africa", + "created": { + "country": [ + "United Arab Republic" + ], + "created": "renamed", + "date": "1971-09-01" + }, + "east": 36.8945446, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/fe/Flag_of_Egypt.svg", + "languages": [ + "Egyptian (Ancient)" + ], + "lat": 26.820553, + "lng": 30.802498, + "name": "Egypt", + "north": 31.671535, + "region": "Northern Africa", + "south": 21.9999999, + "west": 24.6967748 + }, + { + "area": 1302913144530.2227, + "code": "EGEG", + "continent": "Africa", + "dissolved": { + "country": [ + "Egypt" + ], + "date": "1971-09-01", + "dissolved": "renamed" + }, + "east": 36.8945446, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/5/53/Flag_of_Syria.svg", + "lat": 26.820553, + "lng": 30.802498, + "name": "United Arab Republic", + "north": 31.671535, + "region": "Northern Africa", + "south": 21.9999999, + "west": 24.6967748 + }, + { + "area": 657218896448.5967, + "code": "EH", + "continent": "Africa", + "disputed": [ + "Morocco" + ], + "east": -8.666666, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/26/Flag_of_the_Sahrawi_Arab_Democratic_Republic.svg", + "googleName": "Western Sahara", + "imdbName": "Western Sahara", + "lat": 24.215527, + "lng": -12.885834, + "name": "Sahrawi", + "north": 27.6666776, + "region": "Northern Africa", + "south": 20.7709613, + "west": -17.1051121, + "wikipediaName": "Sahrawi Arab Democratic Republic" + }, + { + "area": 454503611784.04706, + "code": "ER", + "continent": "Africa", + "east": 43.1429772, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/29/Flag_of_Eritrea.svg", + "lat": 15.179384, + "lng": 39.782334, + "name": "Eritrea", + "north": 18.0212099, + "region": "Eastern Africa", + "south": 12.354723, + "west": 36.4333479 + }, + { + "area": 3642765521262.5747, + "code": "ES", + "continent": "Europe", + "dependencies": [ + "Canary Islands", + "Ceuta and Melilla" + ], + "east": 4.3279852, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/9/9a/Flag_of_Spain.svg", + "languages": [ + "Spanish", + "Galician", + "Catalan", + "Basque" + ], + "lat": 40.463667, + "lng": -3.74922, + "name": "Spain", + "north": 43.790362, + "region": "Southern Europe", + "south": 27.6378104, + "west": -18.1606357 + }, + { + "area": 2105395255131.262, + "code": "ET", + "continent": "Africa", + "east": 47.9999999, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/7/71/Flag_of_Ethiopia.svg", + "languages": [ + "Amharic" + ], + "lat": 9.145, + "lng": 40.489673, + "name": "Ethiopia", + "north": 14.8942145, + "region": "Eastern Africa", + "south": 3.4041356, + "west": 32.997734 + }, + { + "area": 18914071949433.992, + "code": "EU", + "continent": "Europe", + "east": 34.6045, + "exception": true, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/b7/Flag_of_Europe.svg", + "lat": 51.2480166, + "lng": 1.664671, + "name": "European Union", + "north": 70.0922932, + "region": "Western Europe", + "south": 32.40374, + "west": -31.275158 + }, + { + "area": 602169947135.1476, + "code": "FI", + "continent": "Europe", + "dependencies": [ + "\u00c5land Islands" + ], + "east": 31.5870999, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/bc/Flag_of_Finland.svg", + "languages": [ + "Finnish", + "Saami" + ], + "lat": 61.92411, + "lng": 25.748151, + "name": "Finland", + "north": 70.0922932, + "region": "Northern Europe", + "south": 59.7025822, + "west": 20.5474108 + }, + { + "area": 472715141753.4359, + "code": "FJ", + "continent": "Oceania", + "east": -178.2301068, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/ba/Flag_of_Fiji.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1970-10-10" + }, + "lat": -17.713371, + "lng": 178.065032, + "name": "Fiji", + "north": -12.480116, + "region": "Melanesia", + "south": -20.6759701, + "west": 176.9094944 + }, + { + "area": 32328823430.619804, + "code": "FK", + "continent": "South America", + "dependency": [ + "United Kingdom" + ], + "east": -57.7161145, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/83/Flag_of_the_Falkland_Islands.svg", + "lat": -51.796253, + "lng": -59.523613, + "name": "Falkland Islands", + "north": -51.2332592, + "region": "Southern America", + "south": -52.3952965, + "west": -61.3477064 + }, + { + "area": 1933971039488.7449, + "code": "FM", + "continent": "Oceania", + "created": { + "country": [ + "Pacific Islands" + ], + "created": "split", + "date": "1986-11-03" + }, + "east": 163.0355912, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/e4/Flag_of_the_Federated_States_of_Micronesia.svg", + "imdbName": "Federated States of Micronesia", + "independence": { + "country": [ + "United States" + ], + "date": "1986-11-03" + }, + "lat": 6.8874574, + "lng": 158.2150717, + "name": "Micronesia", + "north": 10.1196133, + "region": "Micronesia", + "south": 3.8224419, + "west": 138.0549824, + "wikipediaName": "Federated States of Micronesia" + }, + { + "area": 8435784826.553218, + "code": "FO", + "continent": "Europe", + "dependency": [ + "Denmark" + ], + "east": -6.251564, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/3c/Flag_of_the_Faroe_Islands.svg", + "languages": [ + "Faroese" + ], + "lat": 61.892635, + "lng": -6.911806, + "name": "Faroe Islands", + "north": 62.3940993, + "region": "Northern Europe", + "south": 61.3909051, + "west": -7.691905 + }, + { + "area": 62124826982781.19, + "code": "FQHH", + "continent": "Antarctica", + "dependency": [ + "France" + ], + "dissolved": { + "country": [ + "Ad\u00e9lie Land", + "French Southern Territories" + ], + "date": "1979", + "dissolved": "split" + }, + "east": 142.1833333333, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/a/a7/Flag_of_the_French_Southern_and_Antarctic_Lands.svg", + "lat": -47.5741173399, + "lng": 88.8927164167, + "name": "French Southern and Antarctic Territories", + "north": -10.0971059, + "region": "Antarctica", + "south": -85.0511287798, + "west": 35.6020995, + "wikipediaName": "French Southern and Antarctic Lands" + }, + { + "area": 1227159963368.9717, + "code": "FR", + "continent": "Europe", + "dependencies": [ + "Ad\u00e9lie Land", + "Clipperton Island", + "French Afar and Issas", + "French Guiana", + "French Polynesia", + "French Southern and Antarctic Territories", + "French Southern Territories", + "Guadeloupe", + "Martinique", + "Mayotte", + "New Caledonia", + "R\u00e9union", + "Saint Barth\u00e9lemy", + "Saint Martin", + "Saint Pierre and Miquelon", + "Wallis and Futuna", + "New Hebrides", + "Antarctica" + ], + "east": 9.5600678, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/c/c3/Flag_of_France.svg", + "languages": [ + "French", + "Breton", + "Corsican" + ], + "lat": 46.227638, + "lng": 2.213749, + "name": "France", + "north": 51.0889618, + "region": "Western Europe", + "south": 41.3423276, + "west": -5.1412279 + }, + { + "area": 568730876782.7081, + "code": "FR-AQ", + "continent": "Antarctica", + "created": { + "country": [ + "French Southern and Antarctic Territories" + ], + "created": "merged", + "date": "1979" + }, + "dependency": [ + "France" + ], + "east": 142.1833333333, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/a/a7/Flag_of_the_French_Southern_and_Antarctic_Lands.svg", + "lat": -72.5255643899, + "lng": 139.1083333333, + "name": "Ad\u00e9lie Land", + "north": -60, + "region": "Antarctica", + "south": -85.0511287798, + "west": 136.0333333333 + }, + { + "area": 1227159963368.9717, + "code": "FXFR", + "continent": "Europe", + "dissolved": { + "country": [ + "France" + ], + "date": "1997", + "dissolved": "joined" + }, + "east": 9.5600678, + "exception": true, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/c/c3/Flag_of_France.svg", + "lat": 46.227638, + "lng": 2.213749, + "name": "Metropolitan France", + "north": 51.0889618, + "region": "Western Europe", + "south": 41.3423276, + "west": -5.1412279 + }, + { + "area": 452514159064.17694, + "code": "GA", + "continent": "Africa", + "east": 14.5205562, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/04/Flag_of_Gabon.svg", + "lat": -0.803689, + "lng": 11.609444, + "name": "Gabon", + "north": 2.3181094, + "region": "Middle Africa", + "south": -3.9583722, + "west": 8.6990528 + }, + { + "area": 805219897437.0283, + "code": "GB", + "continent": "Europe", + "dependencies": [ + "Canton and Enderbury Islands", + "New Hebrides", + "Akrotiri and Dhekelia", + "Anguilla", + "Bermuda", + "British Antarctic Territory", + "British Honduras", + "British Indian Ocean Territory", + "British Virgin Islands", + "Cayman Islands", + "Ellice Islands", + "England", + "Falkland Islands", + "Gibraltar", + "Gilbert and Ellice Islands", + "Gilbert Islands", + "Guernsey", + "Isle of Man", + "Jersey", + "Montserrat", + "Northern Ireland", + "Pitcairn Islands", + "Saint Christopher-Nevis-Anguilla", + "Saint Helena, Ascension and Tristan da Cunha", + "Scotland", + "South Georgia and the South Sandwich Islands", + "Southern Rhodesia", + "Trucial States", + "Turks and Caicos Islands", + "Wales", + "Antarctica" + ], + "disputes": [ + "Sealand" + ], + "east": 1.7629159, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/a/ae/Flag_of_the_United_Kingdom.svg", + "googleName": "UK", + "languages": [ + "Cornish", + "English", + "British" + ], + "lat": 55.36275335, + "lng": -3.4434703, + "name": "United Kingdom", + "north": 60.8607515, + "region": "Northern Europe", + "south": 49.8647552, + "west": -8.6498565 + }, + { + "area": 3763147324.393127, + "code": "GB-AD", + "continent": "Asia", + "dependency": [ + "United Kingdom" + ], + "east": 33.7422416, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/a/ae/Flag_of_the_United_Kingdom.svg", + "lat": 34.7836031, + "lng": 33.3210707, + "name": "Akrotiri and Dhekelia", + "north": 35.0030771, + "region": "Western Asia", + "south": 34.5641291, + "west": 32.8998998 + }, + { + "area": 363979825232.1402, + "code": "GB-ENG", + "continent": "Europe", + "dependency": [ + "United Kingdom" + ], + "east": 1.7629159, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/b/be/Flag_of_England.svg", + "languages": [ + "Middle English", + "Old English" + ], + "lat": 52.3555177, + "lng": -1.1743197, + "name": "England", + "north": 55.8111127, + "region": "Northern Europe", + "south": 49.8647552, + "west": -6.4177822 + }, + { + "area": 25435929475.451546, + "code": "GB-NIR", + "continent": "Europe", + "dependency": [ + "United Kingdom" + ], + "east": -5.4268101, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/88/Ulster_banner.svg", + "lat": 54.7877149, + "lng": -6.4923145, + "name": "Northern Ireland", + "north": 55.31294, + "region": "Northern Europe", + "south": 54.02261, + "west": -8.17754 + }, + { + "area": 326224251952.7849, + "code": "GB-SCT", + "continent": "Europe", + "dependency": [ + "United Kingdom" + ], + "east": -0.7246751, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/10/Flag_of_Scotland.svg", + "lat": 56.4906712, + "lng": -4.2026458, + "name": "Scotland", + "north": 60.8607515, + "region": "Northern Europe", + "south": 54.6332381, + "west": -8.6498565 + }, + { + "area": 2225.6905961695456, + "code": "GB-SL", + "continent": "Europe", + "disputed": [ + "United Kingdom" + ], + "east": 1.4808727056, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/e5/Flag_of_Sealand.svg", + "lat": 51.8951666666, + "lng": 1.4805, + "name": "Sealand", + "north": 51.8953618934, + "region": "Northern Europe", + "south": 51.8949714399, + "west": 1.4801272944 + }, + { + "area": 47051070593.04867, + "code": "GB-WLS", + "continent": "Europe", + "dependency": [ + "United Kingdom" + ], + "east": -2.6497994, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/5/59/Flag_of_Wales_2.svg", + "languages": [ + "Welsh" + ], + "lat": 52.1306607, + "lng": -3.7837117, + "name": "Wales", + "north": 53.4356935, + "region": "Northern Europe", + "south": 51.3749686, + "west": -5.6700973 + }, + { + "area": 190384162117.00742, + "code": "GBAE", + "continent": "Asia", + "dependency": [ + "United Kingdom" + ], + "dissolved": { + "country": [ + "Abu Dhabi", + "Ajman", + "Dubai", + "Fujairah", + "Ras al-Khaimah", + "Sharjah", + "Umm al-Quwain" + ], + "date": "1971-12-01", + "dissolved": "split" + }, + "east": 56.4053766, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/03/Flag_of_the_Trucial_States.svg", + "lat": 23.424076, + "lng": 53.847818, + "name": "Trucial States", + "north": 26.0696541, + "region": "Western Asia", + "south": 22.6315138, + "west": 51.4997702 + }, + { + "area": 54811369908.70548, + "code": "GBBZ", + "continent": "South America", + "dependency": [ + "United Kingdom" + ], + "dissolved": { + "country": [ + "Belize" + ], + "date": "1973-06-01", + "dissolved": "renamed" + }, + "east": -87.4537253, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/8a/Flag_of_British_Honduras.svg", + "lat": 17.189877, + "lng": -88.49765, + "name": "British Honduras", + "north": 18.4959419, + "region": "Central America", + "south": 15.8856189, + "west": -89.2275879 + }, + { + "area": 15756536319.603956, + "code": "GBKN", + "continent": "South America", + "dependency": [ + "United Kingdom" + ], + "dissolved": { + "country": [ + "Anguilla", + "Saint Kitts and Nevis" + ], + "date": "1983-09-19", + "dissolved": "split" + }, + "east": -62.5396943, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d3/Flag_of_St_Kitts-Nevis-Anguilla.svg", + "lat": 17.84486445, + "lng": -62.9845441, + "name": "Saint Christopher-Nevis-Anguilla", + "north": 18.5955719, + "region": "Caribbean", + "south": 17.094157, + "west": -63.4293939 + }, + { + "area": 2804675774.3776283, + "code": "GD", + "continent": "South America", + "east": -61.3779974, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/bc/Flag_of_Grenada.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1974-02-07" + }, + "lat": 12.1165, + "lng": -61.679, + "name": "Grenada", + "north": 12.5301829, + "region": "Caribbean", + "south": 11.9848728, + "west": -61.8027279 + }, + { + "area": 156088824232.12457, + "code": "GE", + "continent": "Asia", + "created": { + "country": [ + "Soviet Union" + ], + "created": "split", + "date": "1991-04-08" + }, + "disputes": [ + "Abkhazia", + "South Ossetia" + ], + "east": 46.736119, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/0f/Flag_of_Georgia.svg", + "languages": [ + "Georgian" + ], + "lat": 42.315407, + "lng": 43.356892, + "name": "Georgia", + "north": 43.586627, + "region": "Western Asia", + "south": 41.054942, + "west": 40.0066113, + "wikipediaName": "Georgia (country)" + }, + { + "area": 22762380667.00968, + "code": "GE-AB", + "continent": "Asia", + "disputed": [ + "Georgia" + ], + "east": 42.149976, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/27/Flag_of_Abkhazia.svg", + "languages": [ + "Abkhazian" + ], + "lat": 42.9737816, + "lng": 41.4421799, + "name": "Abkhazia", + "north": 43.584541, + "region": "Western Asia", + "south": 42.4107362, + "west": 40.0103256 + }, + { + "area": 9503348376.03357, + "code": "GE-SK", + "continent": "Asia", + "disputed": [ + "Georgia" + ], + "east": 44.569049, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/12/Flag_of_South_Ossetia.svg", + "lat": 42.0756944, + "lng": 43.9540462, + "name": "South Ossetia", + "north": 42.633717, + "region": "Western Asia", + "south": 41.733082, + "west": 43.4199111 + }, + { + "area": 5965501850653.527, + "code": "GEHH", + "continent": "Oceania", + "dependency": [ + "United Kingdom" + ], + "dissolved": { + "country": [ + "Ellice Islands", + "Gilbert Islands" + ], + "date": "1976-01-01", + "dissolved": "split" + }, + "east": -173.8042016, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/4d/Flag_of_Gilbert_and_Ellice_Islands.svg", + "lat": -2.27450675, + "lng": 175.5, + "name": "Gilbert and Ellice Islands", + "north": 9.0601953, + "region": "Micronesia", + "south": -13.6092088, + "west": 164.8042016 + }, + { + "area": 2305225292151.7285, + "code": "GEKI", + "continent": "Oceania", + "created": { + "country": [ + "Gilbert and Ellice Islands" + ], + "created": "merged", + "date": "1976-01-01" + }, + "dependency": [ + "United Kingdom" + ], + "dissolved": { + "country": [ + "Kiribati" + ], + "date": "1979-07-12", + "dissolved": "merged" + }, + "east": -178.8042016, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/4d/Flag_of_Gilbert_and_Ellice_Islands.svg", + "lat": 3.3833333, + "lng": 173, + "name": "Gilbert Islands", + "north": 9.0601953, + "region": "Micronesia", + "south": -2.3269492, + "west": 164.8042016 + }, + { + "area": 2268831935617.5347, + "code": "GETV", + "continent": "Oceania", + "created": { + "country": [ + "Gilbert and Ellice Islands" + ], + "created": "merged", + "date": "1976-01-01" + }, + "dependency": [ + "United Kingdom" + ], + "dissolved": { + "country": [ + "Tuvalu" + ], + "date": "1978-10-01", + "dissolved": "renamed" + }, + "east": -173.8042016, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/4d/Flag_of_Gilbert_and_Ellice_Islands.svg", + "lat": -8, + "lng": 178, + "name": "Ellice Islands", + "north": -2.3126027, + "region": "Polynesia", + "south": -13.6092088, + "west": 169.8042016 + }, + { + "area": 131703152816.22295, + "code": "GF", + "continent": "South America", + "dependency": [ + "France" + ], + "east": -51.6335964, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/c/c3/Flag_of_France.svg", + "lat": 3.933889, + "lng": -53.125782, + "name": "French Guiana", + "north": 5.7571896, + "region": "Southern America", + "south": 2.109287, + "west": -54.5544379 + }, + { + "area": 1382842945.3438478, + "code": "GG", + "continent": "Europe", + "dependencies": [ + "Alderney", + "Herm", + "Sark" + ], + "dependency": [ + "United Kingdom" + ], + "east": -2.158637, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/fa/Flag_of_Guernsey.svg", + "lat": 49.465691, + "lng": -2.585278, + "name": "Guernsey", + "north": 49.7323662, + "region": "Northern Europe", + "south": 49.3996333, + "west": -2.6757403 + }, + { + "area": 18496510.77872923, + "code": "GG-AL", + "continent": "Europe", + "dependency": [ + "Guernsey" + ], + "east": -2.1599001, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/f3/Flag_of_Alderney.svg", + "lat": 49.7137136, + "lng": -2.1997945, + "name": "Alderney", + "north": 49.7323662, + "region": "Northern Europe", + "south": 49.7013753, + "west": -2.2343906 + }, + { + "area": 2835852.5652514817, + "code": "GG-HE", + "continent": "Europe", + "dependency": [ + "Guernsey" + ], + "east": -2.4410724, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/b8/Flag_of_Herm.svg", + "lat": 49.472872, + "lng": -2.4492132, + "name": "Herm", + "north": 49.4831115, + "region": "Northern Europe", + "south": 49.4626538, + "west": -2.4582871 + }, + { + "area": 13510368.339833157, + "code": "GG-SA", + "continent": "Europe", + "dependency": [ + "Guernsey" + ], + "east": -2.3425271, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/64/Flag_of_Sark.svg", + "lat": 49.4301912, + "lng": -2.3609034, + "name": "Sark", + "north": 49.4485712, + "region": "Northern Europe", + "south": 49.4071203, + "west": -2.3829667 + }, + { + "area": 351664755314.6241, + "code": "GH", + "continent": "Africa", + "east": 1.1993625, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/19/Flag_of_Ghana.svg", + "lat": 7.946527, + "lng": -1.023194, + "name": "Ghana", + "north": 11.1666675, + "region": "Western Africa", + "south": 4.7388737, + "west": -3.260786 + }, + { + "area": 12812781.728020666, + "code": "GI", + "continent": "Europe", + "dependency": [ + "United Kingdom" + ], + "east": -5.3386837, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/02/Flag_of_Gibraltar.svg", + "lat": 36.137741, + "lng": -5.345374, + "name": "Gibraltar", + "north": 36.1551188, + "region": "Southern Europe", + "south": 36.1087953, + "west": -5.3663194 + }, + { + "area": 5684397767796.773, + "code": "GL", + "continent": "North America", + "dependency": [ + "Denmark" + ], + "east": -11.3123192, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/09/Flag_of_Greenland.svg", + "languages": [ + "Greenlandic", + "East-Greenlandic" + ], + "lat": 71.706936, + "lng": -42.604303, + "name": "Greenland", + "north": 83.609581, + "region": "Northern America", + "south": 59.7774011, + "west": -73.0350638 + }, + { + "area": 27660622705.98084, + "code": "GM", + "continent": "Africa", + "east": -13.7986107, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/7/77/Flag_of_The_Gambia.svg", + "googleName": "The Gambia", + "lat": 13.443182, + "lng": -15.310139, + "name": "Gambia", + "north": 13.8263891, + "region": "Western Africa", + "south": 13.0651826, + "west": -16.8136312, + "wikipediaName": "The Gambia" + }, + { + "area": 497835096177.14996, + "code": "GN", + "continent": "Africa", + "east": -7.637853, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/ed/Flag_of_Guinea.svg", + "languages": [ + "Malinka" + ], + "lat": 9.945587, + "lng": -9.696645, + "name": "Guinea", + "north": 12.6746168, + "region": "Western Africa", + "south": 7.1909091, + "west": -15.0782061 + }, + { + "area": 6556021366.668401, + "code": "GP", + "continent": "South America", + "dependency": [ + "France" + ], + "east": -61.0016727, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/7/7d/Flag_of_Guadeloupe_%28local%29_variant.svg", + "lat": 16.265, + "lng": -61.551, + "name": "Guadeloupe", + "north": 16.514251, + "region": "Caribbean", + "south": 15.8320009, + "west": -61.8090819 + }, + { + "area": 374349308049.2413, + "code": "GQ", + "continent": "Africa", + "east": 11.3333, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/31/Flag_of_Equatorial_Guinea.svg", + "lat": 1.650801, + "lng": 10.267895, + "name": "Equatorial Guinea", + "north": 3.8142257, + "region": "Middle Africa", + "south": -1.4599463, + "west": 5.602367 + }, + { + "area": 693935829152.6224, + "code": "GR", + "continent": "Europe", + "east": 29.6451476, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/5/5c/Flag_of_Greece.svg", + "languages": [ + "Greek, Ancient (to 1453)", + "Greek" + ], + "lat": 39.074208, + "lng": 21.824312, + "name": "Greece", + "north": 41.7490577, + "region": "Southern Europe", + "south": 34.8010211, + "west": 19.3724227 + }, + { + "area": 448320344053.2159, + "code": "GS", + "continent": "Antarctica", + "dependency": [ + "United Kingdom" + ], + "east": -26.2689113, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/ed/Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg", + "lat": -54.429579, + "lng": -36.587909, + "name": "South Georgia and the South Sandwich Islands", + "north": -53.9749413, + "region": "Antarctica", + "south": -59.4842948, + "west": -38.2436013 + }, + { + "area": 194673246823.7558, + "code": "GT", + "continent": "South America", + "east": -88.2256154, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/ec/Flag_of_Guatemala.svg", + "lat": 15.783471, + "lng": -90.230759, + "name": "Guatemala", + "north": 17.8156973, + "region": "Central America", + "south": 13.7400214, + "west": -92.2318359 + }, + { + "area": 1662939203.6335418, + "code": "GU", + "continent": "Oceania", + "dependency": [ + "United States" + ], + "east": 144.9565361, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/07/Flag_of_Guam.svg", + "lat": 13.444304, + "lng": 144.793731, + "name": "Guam", + "north": 13.6542247, + "region": "Micronesia", + "south": 13.2461906, + "west": 144.6183806 + }, + { + "area": 68271976061.1821, + "code": "GW", + "continent": "Africa", + "east": -13.6275045, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/01/Flag_of_Guinea-Bissau.svg", + "independence": { + "country": [ + "Portugal" + ], + "date": "1974-09-10" + }, + "lat": 11.803749, + "lng": -15.180413, + "name": "Guinea-Bissau", + "north": 12.6847224, + "region": "Western Africa", + "south": 10.8599702, + "west": -16.7117356 + }, + { + "area": 448583282781.9713, + "code": "GY", + "continent": "South America", + "east": -56.49112, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/99/Flag_of_Guyana.svg", + "lat": 4.860416, + "lng": -58.93018, + "name": "Guyana", + "north": 8.5482551, + "region": "Southern America", + "south": 1.164724, + "west": -61.414905 + }, + { + "area": 2675258279.897878, + "code": "HK", + "continent": "Asia", + "dependency": [ + "China" + ], + "east": 114.4064451, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/5/5b/Flag_of_Hong_Kong.svg", + "lat": 22.396428, + "lng": 114.109497, + "name": "Hong Kong", + "north": 22.561968, + "region": "Eastern Asia", + "south": 22.153415, + "west": 113.835078 + }, + { + "area": 898379286.1072774, + "code": "HM", + "continent": "Antarctica", + "dependency": [ + "Australia" + ], + "east": 73.7760832, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/b/b9/Flag_of_Australia.svg", + "lat": -53.08181, + "lng": 73.504158, + "name": "Heard Island and McDonald Islands", + "north": -52.9616166, + "region": "Antarctica", + "south": -53.191547, + "west": 73.25124 + }, + { + "area": 329593680778.0184, + "code": "HN", + "continent": "South America", + "east": -83.1360769, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/82/Flag_of_Honduras.svg", + "lat": 15.199999, + "lng": -86.241905, + "name": "Honduras", + "north": 17.4171037, + "region": "Central America", + "south": 12.9842246, + "west": -89.355148 + }, + { + "area": 219254644975.7154, + "code": "HR", + "continent": "Europe", + "created": { + "country": [ + "Yugoslavia" + ], + "created": "split", + "date": "1991-10-08" + }, + "east": 19.4480523, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/1b/Flag_of_Croatia.svg", + "languages": [ + "Croatian" + ], + "lat": 45.7533427, + "lng": 15.9891256, + "name": "Croatia", + "north": 46.5545821, + "region": "Southern Europe", + "south": 42.3922652, + "west": 13.4896912 + }, + { + "area": 69236306770.87717, + "code": "HT", + "continent": "South America", + "east": -71.621754, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/5/56/Flag_of_Haiti.svg", + "languages": [ + "Haitian" + ], + "lat": 18.971187, + "lng": -72.285215, + "name": "Haiti", + "north": 20.0896142, + "region": "Caribbean", + "south": 18.0220783, + "west": -74.4809103 + }, + { + "area": 162789619928.83163, + "code": "HU", + "continent": "Europe", + "east": 22.8977483, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/c/c1/Flag_of_Hungary.svg", + "languages": [ + "Hungarian" + ], + "lat": 47.162494, + "lng": 19.503304, + "name": "Hungary", + "north": 48.585233, + "region": "Eastern Europe", + "south": 45.7370425, + "west": 16.1136812 + }, + { + "area": 546016014803.1511, + "code": "HVBF", + "continent": "Africa", + "dissolved": { + "country": [ + "Burkina Faso" + ], + "date": "1984-08-04", + "dissolved": "renamed" + }, + "east": 2.4042926, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/4a/Flag_of_Upper_Volta.svg", + "lat": 12.238333, + "lng": -1.561593, + "name": "Upper Volta", + "north": 15.0851111, + "region": "Western Africa", + "south": 9.3938888, + "west": -5.5211114, + "wikipediaName": "Republic of Upper Volta" + }, + { + "area": 102301591792.1246, + "code": "IC", + "continent": "Africa", + "dependency": [ + "Spain" + ], + "east": -13.2548812, + "exception": true, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/b0/Flag_of_the_Canary_Islands.svg", + "lat": 28.5960844, + "lng": -15.70778805, + "name": "Canary Islands", + "north": 29.5544184, + "region": "Northern Africa", + "south": 27.6377504, + "west": -18.1606949 + }, + { + "area": 9594565020426.38, + "code": "ID", + "continent": "Asia", + "disputes": [ + "East Timor" + ], + "east": 141.0195621, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/9f/Flag_of_Indonesia.svg", + "languages": [ + "Indonesian", + "Balinese" + ], + "lat": -0.789275, + "lng": 113.921327, + "name": "Indonesia", + "north": 5.9068839, + "region": "South-Eastern Asia", + "south": -10.997112, + "west": 95.004677 + }, + { + "area": 136961104671.18498, + "code": "IE", + "continent": "Europe", + "east": -5.9947001, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/45/Flag_of_Ireland.svg", + "languages": [ + "Irish Gaelic", + "Gaelic" + ], + "lat": 53.41291, + "lng": -8.24389, + "name": "Ireland", + "north": 55.3885, + "region": "Northern Europe", + "south": 51.4219377, + "west": -10.66958, + "wikipediaName": "Republic of Ireland" + }, + { + "area": 66175066395.60376, + "code": "IL", + "continent": "Asia", + "east": 35.896244, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d4/Flag_of_Israel.svg", + "languages": [ + "Yiddish", + "Hebrew" + ], + "lat": 31.046051, + "lng": 34.851612, + "name": "Israel", + "north": 33.332805, + "region": "Western Asia", + "south": 29.4906463, + "west": 34.2673871 + }, + { + "area": 1412207340.395639, + "code": "IM", + "continent": "Europe", + "dependency": [ + "United Kingdom" + ], + "east": -4.308328, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/bc/Flag_of_the_Isle_of_Man.svg", + "lat": 54.236107, + "lng": -4.548056, + "name": "Isle of Man", + "north": 54.418247, + "region": "Northern Europe", + "south": 54.04464, + "west": -4.8301808 + }, + { + "area": 9615713680843.55, + "code": "IN", + "continent": "Asia", + "dependencies": [ + "Jammu and Kashmir" + ], + "east": 97.395555, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/4/41/Flag_of_India.svg", + "languages": [ + "Telugu", + "Malayalam", + "Ladakhi", + "Marathi", + "Punjabi", + "Chhattisgarhi", + "Gujarati", + "Indian", + "Hindi", + "Rajasthani", + "Kannada", + "Konkani", + "Assamese", + "Nagpuri" + ], + "lat": 20.593684, + "lng": 78.96288, + "name": "India", + "north": 35.5043404, + "region": "Southern Asia", + "south": 6.7471389, + "west": 68.1623859 + }, + { + "area": 183577268308.88663, + "code": "IN-JK", + "continent": "Asia", + "dependency": [ + "India" + ], + "east": 79.3058506, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/4/41/Flag_of_India.svg", + "lat": 34.1490875, + "lng": 76.8259652, + "name": "Jammu and Kashmir", + "north": 35.5054274, + "region": "Southern Asia", + "south": 32.2922694, + "west": 73.750507 + }, + { + "area": 34218784588.192184, + "code": "IO", + "continent": "Asia", + "dependencies": [ + "Diego Garcia" + ], + "dependency": [ + "United Kingdom" + ], + "east": 72.4946969, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/6e/Flag_of_the_British_Indian_Ocean_Territory.svg", + "lat": -7.3347556, + "lng": 72.4242325, + "name": "British Indian Ocean Territory", + "north": -5.2356445, + "region": "Southern Asia", + "south": -7.4440709, + "west": 71.2365532 + }, + { + "area": 842965703341.2957, + "code": "IQ", + "continent": "Asia", + "disputes": [ + "Neutral Zone" + ], + "east": 48.5759163, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/f6/Flag_of_Iraq.svg", + "lat": 33.223191, + "lng": 43.679291, + "name": "Iraq", + "north": 37.380932, + "region": "Western Asia", + "south": 29.0612079, + "west": 38.7936029 + }, + { + "area": 2964307206158.564, + "code": "IR", + "continent": "Asia", + "east": 63.3333366, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/c/ca/Flag_of_Iran.svg", + "languages": [ + "Parsee", + "Persian" + ], + "lat": 32.427908, + "lng": 53.688046, + "name": "Iran", + "north": 39.7816755, + "region": "Southern Asia", + "south": 25.0594286, + "west": 44.0318907 + }, + { + "area": 189720716980.4097, + "code": "IS", + "continent": "Europe", + "east": -13.4958153, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/c/ce/Flag_of_Iceland.svg", + "languages": [ + "Icelandic" + ], + "lat": 64.963051, + "lng": -19.020835, + "name": "Iceland", + "north": 66.5663183, + "region": "Northern Europe", + "south": 63.2961021, + "west": -24.5465239 + }, + { + "area": 1282291932897.9644, + "code": "IT", + "continent": "Europe", + "east": 18.5205015, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/0/03/Flag_of_Italy.svg", + "languages": [ + "Italian", + "Latin", + "Sicilian", + "Sardinian", + "Neapolitan", + "Ladino" + ], + "lat": 41.87194, + "lng": 12.56738, + "name": "Italy", + "north": 47.092, + "region": "Southern Europe", + "south": 35.4929201, + "west": 6.6267201 + }, + { + "area": 202249893.62638405, + "code": "JE", + "continent": "Europe", + "dependency": [ + "United Kingdom" + ], + "east": -2.0104646, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/1c/Flag_of_Jersey.svg", + "lat": 49.214439, + "lng": -2.13125, + "name": "Jersey", + "north": 49.2621314, + "region": "Northern Europe", + "south": 49.1598142, + "west": -2.2546394 + }, + { + "area": 21098041404.1928, + "code": "JM", + "continent": "South America", + "east": -76.183159, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/0a/Flag_of_Jamaica.svg", + "lat": 18.109581, + "lng": -77.297508, + "name": "Jamaica", + "north": 18.5253104, + "region": "Caribbean", + "south": 17.7057243, + "west": -78.3688461 + }, + { + "area": 192654449675.157, + "code": "JO", + "continent": "Asia", + "east": 39.301154, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/c/c0/Flag_of_Jordan.svg", + "lat": 30.585164, + "lng": 36.238414, + "name": "Jordan", + "north": 33.3746878, + "region": "Western Asia", + "south": 29.1850361, + "west": 34.9583368 + }, + { + "area": 6748094849742.678, + "code": "JP", + "continent": "Asia", + "east": 153.9874306, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/9/9e/Flag_of_Japan.svg", + "languages": [ + "Ryukyuan", + "Japanese" + ], + "lat": 36.204824, + "lng": 138.252924, + "name": "Japan", + "north": 45.5227719, + "region": "Eastern Asia", + "south": 24.0460446, + "west": 122.9338302 + }, + { + "area": 4565866.285081814, + "code": "JTUM", + "continent": "Oceania", + "dependency": [ + "United States" + ], + "dissolved": { + "country": [ + "United States Minor Outlying Islands" + ], + "date": "1986", + "dissolved": "merged" + }, + "east": -169.5171052, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/e5/Flag_of_Johnston_Atoll_%28local%29.svg", + "lat": 16.7322716, + "lng": -169.5308371, + "name": "Johnston Island", + "north": 16.7411326, + "region": "Polynesia", + "south": 16.7265491, + "west": -169.5434874, + "wikipediaName": "Johnston Atoll" + }, + { + "area": 347276559114.394, + "code": "KAKH", + "continent": "Asia", + "created": { + "country": [ + "Khmer Republic" + ], + "created": "renamed", + "date": "1975-04-17" + }, + "dissolved": { + "country": [ + "Cambodia" + ], + "date": "1989-05-01", + "dissolved": "renamed" + }, + "east": 107.627687, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/83/Flag_of_Cambodia.svg", + "lat": 12.565679, + "lng": 104.990963, + "name": "Kampuchea", + "north": 14.6901791, + "region": "South-Eastern Asia", + "south": 9.2768081, + "west": 102.333542, + "wikipediaName": "People's Republic of Kampuchea" + }, + { + "area": 961403763583.1138, + "code": "KE", + "continent": "Africa", + "east": 41.9068317, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/49/Flag_of_Kenya.svg", + "languages": [ + "Swahili" + ], + "lat": -0.023559, + "lng": 37.906193, + "name": "Kenya", + "north": 5.0334209, + "region": "Eastern Africa", + "south": -4.6796816, + "west": 33.9098212 + }, + { + "area": 417817066861.2235, + "code": "KG", + "continent": "Asia", + "created": { + "country": [ + "Soviet Union" + ], + "created": "split", + "date": "1991-08-31" + }, + "east": 80.2265594, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/c/c7/Flag_of_Kyrgyzstan.svg", + "languages": [ + "Kyrgyz" + ], + "lat": 41.20438, + "lng": 74.766098, + "name": "Kyrgyzstan", + "north": 43.2653569, + "region": "Central Asia", + "south": 39.180254, + "west": 69.250998 + }, + { + "area": 347276559114.394, + "code": "KH", + "continent": "Asia", + "created": { + "country": [ + "Kampuchea" + ], + "created": "renamed", + "date": "1989-05-01" + }, + "east": 107.627687, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/83/Flag_of_Cambodia.svg", + "languages": [ + "Central Khmer" + ], + "lat": 12.565679, + "lng": 104.990963, + "name": "Cambodia", + "north": 14.6901791, + "region": "South-Eastern Asia", + "south": 9.2768081, + "west": 102.333542 + }, + { + "area": 347276559114.394, + "code": "KHKA", + "continent": "Asia", + "dissolved": { + "country": [ + "Kampuchea" + ], + "date": "1975-04-17", + "dissolved": "renamed" + }, + "east": 107.627687, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/a/a8/Flag_of_the_Khmer_Republic.svg", + "lat": 12.565679, + "lng": 104.990963, + "name": "Khmer Republic", + "north": 14.6901791, + "region": "South-Eastern Asia", + "south": 9.2768081, + "west": 102.333542 + }, + { + "area": 8019481073582.918, + "code": "KI", + "continent": "Oceania", + "created": { + "country": [ + "Canton and Enderbury Islands", + "Gilbert Islands" + ], + "created": "merged", + "date": "1979-07-12" + }, + "east": -150.1958942, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d3/Flag_of_Kiribati.svg", + "independence": { + "country": [ + "United Kingdom", + "United States" + ], + "date": "1979-07-12" + }, + "lat": 1.8668577, + "lng": -157.3599202, + "name": "Kiribati", + "north": 4.6999585, + "region": "Micronesia", + "south": -11.4465192, + "west": 169.5215322 + }, + { + "area": 16808179818.356485, + "code": "KM", + "continent": "Africa", + "disputes": [ + "Anjouan", + "Moh\u00e9li" + ], + "east": 44.5405698, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/94/Flag_of_the_Comoros.svg", + "independence": { + "country": [ + "France" + ], + "date": "1975-07-06" + }, + "lat": -11.6455, + "lng": 43.3333, + "name": "Comoros", + "north": -11.3646394, + "region": "Eastern Africa", + "south": -12.4138212, + "west": 43.2194215 + }, + { + "area": 1351202438.2582128, + "code": "KM-A", + "continent": "Africa", + "disputed": [ + "Comoros" + ], + "dissolved": { + "country": [ + "Comoros" + ], + "date": "2002-03-10", + "dissolved": "joined" + }, + "east": 44.536171, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/5/58/Flag_of_Anjouan.svg", + "lat": -12.2138145, + "lng": 44.4370606, + "name": "Anjouan", + "north": -12.0634182, + "region": "Eastern Africa", + "south": -12.388629, + "west": 44.1931056 + }, + { + "area": 433890115.14031255, + "code": "KM-M", + "continent": "Africa", + "disputed": [ + "Comoros" + ], + "dissolved": { + "country": [ + "Comoros" + ], + "date": "2002-03-10", + "dissolved": "joined" + }, + "east": 43.8763046, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/32/Flag_of_Moh%C3%A9li.svg", + "lat": -12.3377376, + "lng": 43.7334089, + "name": "Moh\u00e9li", + "north": -12.2490952, + "region": "Eastern Africa", + "south": -12.3899703, + "west": 43.6219025 + }, + { + "area": 1246017604.5899081, + "code": "KN", + "continent": "South America", + "created": { + "country": [ + "Saint Christopher-Nevis-Anguilla" + ], + "created": "merged", + "date": "1983-09-19" + }, + "east": -62.5396943, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/fe/Flag_of_Saint_Kitts_and_Nevis.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1983-09-19" + }, + "lat": 17.357822, + "lng": -62.782998, + "name": "Saint Kitts and Nevis", + "north": 17.4182012, + "region": "Caribbean", + "south": 17.094157, + "west": -62.8646171 + }, + { + "area": 651542072400.697, + "code": "KOJP", + "continent": "Asia", + "dissolved": { + "country": [ + "Japan" + ], + "date": "1910-08-22", + "dissolved": "joined" + }, + "east": 130.9232178, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/90/Flag_of_Korea_1882.svg", + "lat": 38.05884975, + "lng": 127.5483853, + "name": "Korea", + "north": 43.01159, + "region": "Eastern Asia", + "south": 33.1061095, + "west": 124.1735528, + "wikipediaName": "Korean Empire" + }, + { + "area": 328364393694.9923, + "code": "KP", + "continent": "Asia", + "east": 130.6884659, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/5/51/Flag_of_North_Korea.svg", + "lat": 40.339852, + "lng": 127.510093, + "name": "North Korea", + "north": 43.01159, + "region": "Eastern Asia", + "south": 37.6733322, + "west": 124.1735528 + }, + { + "area": 349372296031.2838, + "code": "KR", + "continent": "Asia", + "east": 130.9232178, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/09/Flag_of_South_Korea.svg", + "languages": [ + "Korean" + ], + "lat": 35.907757, + "lng": 127.766922, + "name": "South Korea", + "north": 38.6169312, + "region": "Eastern Asia", + "south": 33.1061095, + "west": 124.6081391 + }, + { + "area": 32035570981.040043, + "code": "KW", + "continent": "Asia", + "east": 48.4304579, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/a/aa/Flag_of_Kuwait.svg", + "lat": 29.31166, + "lng": 47.481766, + "name": "Kuwait", + "north": 30.1036993, + "region": "Western Asia", + "south": 28.5244463, + "west": 46.5530399 + }, + { + "area": 9794506562.796618, + "code": "KY", + "continent": "South America", + "dependency": [ + "United Kingdom" + ], + "east": -79.7229976, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/0f/Flag_of_the_Cayman_Islands.svg", + "lat": 19.3133, + "lng": -81.2546, + "name": "Cayman Islands", + "north": 19.7569685, + "region": "Caribbean", + "south": 19.262839, + "west": -81.4199933 + }, + { + "area": 5019847650736.817, + "code": "KZ", + "continent": "Asia", + "created": { + "country": [ + "Soviet Union" + ], + "created": "split", + "date": "1991-12-16" + }, + "east": 87.315415, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d3/Flag_of_Kazakhstan.svg", + "languages": [ + "Kazakh" + ], + "lat": 48.019573, + "lng": 66.923684, + "name": "Kazakhstan", + "north": 55.4419839, + "region": "Central Asia", + "south": 40.5685841, + "west": 46.4936719 + }, + { + "area": 769236378929.5938, + "code": "LA", + "continent": "Asia", + "east": 107.69483, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/5/56/Flag_of_Laos.svg", + "languages": [ + "Lao" + ], + "lat": 19.85627, + "lng": 102.495496, + "name": "Laos", + "north": 22.502872, + "region": "South-Eastern Asia", + "south": 13.90972, + "west": 100.0832139 + }, + { + "area": 25599974731.623253, + "code": "LB", + "continent": "Asia", + "east": 36.62372, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/5/59/Flag_of_Lebanon.svg", + "lat": 33.854721, + "lng": 35.862285, + "name": "Lebanon", + "north": 34.69209, + "region": "Western Asia", + "south": 33.0550256, + "west": 35.1037781 + }, + { + "area": 1000911440.6765518, + "code": "LC", + "continent": "South America", + "east": -60.8730984, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/9f/Flag_of_Saint_Lucia.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1979-02-22" + }, + "lat": 13.909444, + "lng": -60.978893, + "name": "Saint Lucia", + "north": 14.110932, + "region": "Caribbean", + "south": 13.7081176, + "west": -61.0796719 + }, + { + "area": 307188145.3271731, + "code": "LI", + "continent": "Europe", + "east": 9.6356501, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/47/Flag_of_Liechtenstein.svg", + "lat": 47.166, + "lng": 9.555373, + "name": "Liechtenstein", + "north": 47.2705467, + "region": "Western Europe", + "south": 47.04829, + "west": 9.47162 + }, + { + "area": 108146322532.06985, + "code": "LK", + "continent": "Asia", + "created": { + "country": [ + "Ceylon" + ], + "created": "renamed", + "date": "1972-05-22" + }, + "east": 81.8787029, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/11/Flag_of_Sri_Lanka.svg", + "languages": [ + "Tamil", + "Sinhala" + ], + "lat": 7.873054, + "lng": 80.771797, + "name": "Sri Lanka", + "north": 9.8358504, + "region": "Southern Asia", + "south": 5.9190779, + "west": 79.6289063 + }, + { + "area": 108146322532.06985, + "code": "LKLK", + "continent": "Asia", + "dissolved": { + "country": [ + "Sri Lanka" + ], + "date": "1972-05-22", + "dissolved": "renamed" + }, + "east": 81.8787029, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/11/Flag_of_Sri_Lanka.svg", + "lat": 7.873054, + "lng": 80.771797, + "name": "Ceylon", + "north": 9.8358504, + "region": "Southern Asia", + "south": 5.9190779, + "west": 79.6289063, + "wikipediaName": "Dominion of Ceylon" + }, + { + "area": 214104980161.3113, + "code": "LR", + "continent": "Africa", + "east": -7.3692549, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/b8/Flag_of_Liberia.svg", + "lat": 6.428055, + "lng": -9.429499, + "name": "Liberia", + "north": 8.551986, + "region": "Western Africa", + "south": 4.3154139, + "west": -11.4742481 + }, + { + "area": 55421396805.47649, + "code": "LS", + "continent": "Africa", + "east": 29.4557087, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/4a/Flag_of_Lesotho.svg", + "languages": [ + "Sotho" + ], + "lat": -29.609988, + "lng": 28.233608, + "name": "Lesotho", + "north": -28.5708011, + "region": "Southern Africa", + "south": -30.6755788, + "west": 27.011231 + }, + { + "area": 106358319926.30257, + "code": "LT", + "continent": "Europe", + "created": { + "country": [ + "Soviet Union" + ], + "created": "split", + "date": "1990-03-11" + }, + "east": 26.8355913, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/11/Flag_of_Lithuania.svg", + "languages": [ + "Lithuanian" + ], + "lat": 55.169438, + "lng": 23.881275, + "name": "Lithuania", + "north": 56.4503175, + "region": "Northern Europe", + "south": 53.8968787, + "west": 20.9494113 + }, + { + "area": 4674257255.530052, + "code": "LU", + "continent": "Europe", + "east": 6.5309701, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/da/Flag_of_Luxembourg.svg", + "languages": [ + "Luxembourgish" + ], + "lat": 49.815273, + "lng": 6.129583, + "name": "Luxembourg", + "north": 50.18282, + "region": "Western Europe", + "south": 49.447779, + "west": 5.7356699 + }, + { + "area": 118717138606.8546, + "code": "LV", + "continent": "Europe", + "created": { + "country": [ + "Soviet Union" + ], + "created": "split", + "date": "1990-05-04" + }, + "east": 28.2414029, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/84/Flag_of_Latvia.svg", + "languages": [ + "Latvian" + ], + "lat": 56.879635, + "lng": 24.603189, + "name": "Latvia", + "north": 58.0855713, + "region": "Northern Europe", + "south": 55.6748581, + "west": 20.9677297 + }, + { + "area": 2385694115754.925, + "code": "LY", + "continent": "Africa", + "east": 25.146954, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/05/Flag_of_Libya.svg", + "lat": 26.3351, + "lng": 17.228331, + "name": "Libya", + "north": 33.1667871, + "region": "Northern Africa", + "south": 19.5004298, + "west": 9.3914664 + }, + { + "area": 1057837882590.855, + "code": "MA", + "continent": "Africa", + "disputes": [ + "Sahrawi" + ], + "east": -0.9969757, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/2c/Flag_of_Morocco.svg", + "languages": [ + "Berber" + ], + "lat": 31.791702, + "lng": -7.09262, + "name": "Morocco", + "north": 35.9225072, + "region": "Northern Africa", + "south": 27.6666665, + "west": -13.1728913 + }, + { + "area": 7463646.767946672, + "code": "MC", + "continent": "Europe", + "east": 7.4397977, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/ea/Flag_of_Monaco.svg", + "lat": 43.7384176, + "lng": 7.4246158, + "name": "Monaco", + "north": 43.7519029, + "region": "Western Europe", + "south": 43.7247428, + "west": 7.4091049 + }, + { + "area": 90672046125.44339, + "code": "MD", + "continent": "Europe", + "created": { + "country": [ + "Soviet Union" + ], + "created": "split", + "date": "1991-08-27" + }, + "disputes": [ + "Transnistria" + ], + "east": 30.162538, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/27/Flag_of_Moldova.svg", + "lat": 47.411631, + "lng": 28.369885, + "name": "Moldova", + "north": 48.491944, + "region": "Eastern Europe", + "south": 45.466904, + "west": 26.6168559 + }, + { + "area": 19725872725.2967, + "code": "MD-SN", + "continent": "Europe", + "disputed": [ + "Moldova" + ], + "east": 29.983877, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/93/Transnistria_State_Flag.svg", + "lat": 47.2152972, + "lng": 29.4638054, + "name": "Transnistria", + "north": 48.172153, + "region": "Eastern Europe", + "south": 46.556053, + "west": 28.5296401 + }, + { + "area": 29942034495.52669, + "code": "ME", + "continent": "Europe", + "created": { + "country": [ + "Serbia and Montenegro" + ], + "created": "merged", + "date": "2006-06-05" + }, + "east": 20.3577649, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/64/Flag_of_Montenegro.svg", + "lat": 42.708678, + "lng": 19.37439, + "name": "Montenegro", + "north": 43.558743, + "region": "Southern Europe", + "south": 41.8497166, + "west": 18.4337921 + }, + { + "area": 169903608.20528534, + "code": "MF", + "continent": "South America", + "dependency": [ + "France" + ], + "east": -62.9703926, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/ec/Flag_of_Saint-Martin_%28local%29.svg", + "imdbName": "Saint Martin (French part)", + "lat": 18.08255, + "lng": -63.052251, + "name": "Saint Martin", + "north": 18.1251338, + "region": "Caribbean", + "south": 18.0462894, + "west": -63.1533267, + "wikipediaName": "Collectivity of Saint Martin" + }, + { + "area": 1166481756065.726, + "code": "MG", + "continent": "Africa", + "east": 50.4837799, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/bc/Flag_of_Madagascar.svg", + "languages": [ + "Malagasy" + ], + "lat": -18.766947, + "lng": 46.869107, + "name": "Madagascar", + "north": -11.9519639, + "region": "Eastern Africa", + "south": -25.6065717, + "west": 43.1851395 + }, + { + "area": 1401538572034.8486, + "code": "MH", + "continent": "Oceania", + "created": { + "country": [ + "Pacific Islands" + ], + "created": "split", + "date": "1986-10-21" + }, + "east": 172.1701812, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/2e/Flag_of_the_Marshall_Islands.svg", + "independence": { + "country": [ + "United States" + ], + "date": "1986-10-21" + }, + "languages": [ + "Marshallese" + ], + "lat": 7.131474, + "lng": 171.184478, + "name": "Marshall Islands", + "north": 14.673255, + "region": "Micronesia", + "south": 4.5729556, + "west": 160.7979585 + }, + { + "area": 5129054.21672786, + "code": "MIUM", + "continent": "Oceania", + "dependency": [ + "United States" + ], + "dissolved": { + "country": [ + "United States Minor Outlying Islands" + ], + "date": "1986", + "dissolved": "merged" + }, + "east": -177.3695147, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/2a/Flag_of_the_Midway_Islands_%28local%29.svg", + "lat": 28.2102937, + "lng": -177.3790097, + "name": "Midway Islands", + "north": 28.2150965, + "region": "Polynesia", + "south": 28.1963806, + "west": -177.3946094, + "wikipediaName": "Midway Atoll" + }, + { + "area": 36351891212.97518, + "code": "MK", + "continent": "Europe", + "created": { + "country": [ + "Yugoslavia" + ], + "created": "split", + "date": "1991-09-08" + }, + "east": 23.034093, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/f8/Flag_of_Macedonia.svg", + "googleName": "Former Yugoslav Republic of Macedonia", + "imdbName": "Republic of Macedonia", + "languages": [ + "Macedonian" + ], + "lat": 41.608635, + "lng": 21.745275, + "name": "Macedonia", + "north": 42.373646, + "region": "Southern Europe", + "south": 40.8537826, + "west": 20.452423, + "wikipediaName": "Republic of Macedonia" + }, + { + "area": 2887946393570.568, + "code": "ML", + "continent": "Africa", + "disputes": [ + "Azawad" + ], + "east": 4.2666666, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/92/Flag_of_Mali.svg", + "languages": [ + "Bambara" + ], + "lat": 17.570692, + "lng": -3.996166, + "name": "Mali", + "north": 25.000012, + "region": "Western Africa", + "south": 10.147811, + "west": -12.2388849 + }, + { + "area": 1271270205170.716, + "code": "ML-AZ", + "continent": "Africa", + "created": { + "country": [ + "Mali" + ], + "created": "split", + "date": "2012-04-06" + }, + "disputed": [ + "Mali" + ], + "east": 4.249149, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/5/50/MNLA_flag.svg", + "lat": 19.94921905, + "lng": -1.157628, + "name": "Azawad", + "north": 25.0020452, + "region": "Western Africa", + "south": 14.8963929, + "west": -6.564405 + }, + { + "area": 1987185942406.8538, + "code": "MM", + "continent": "Asia", + "created": { + "country": [ + "Burma" + ], + "created": "renamed", + "date": "1989-06-18" + }, + "east": 101.1702717, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/8c/Flag_of_Myanmar.svg", + "googleName": "Burma", + "lat": 21.913965, + "lng": 95.956223, + "name": "Myanmar", + "north": 28.5478351, + "region": "South-Eastern Asia", + "south": 9.6053198, + "west": 92.171808 + }, + { + "area": 2878341099123.783, + "code": "MN", + "continent": "Asia", + "east": 119.9319489, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/4c/Flag_of_Mongolia.svg", + "languages": [ + "Mongolian" + ], + "lat": 46.862496, + "lng": 103.846656, + "name": "Mongolia", + "north": 52.1486965, + "region": "Eastern Asia", + "south": 41.5815201, + "west": 87.73762 + }, + { + "area": 87023510.08074442, + "code": "MO", + "continent": "Asia", + "dependency": [ + "China" + ], + "east": 113.5982798, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/63/Flag_of_Macau.svg", + "imdbName": "Macao", + "lat": 22.198745, + "lng": 113.543873, + "name": "Macau", + "north": 22.2170639, + "region": "Eastern Asia", + "south": 22.1097717, + "west": 113.5276053 + }, + { + "area": 89758868871.01183, + "code": "MP", + "continent": "Oceania", + "created": { + "country": [ + "Pacific Islands" + ], + "created": "split", + "date": "1978" + }, + "dependency": [ + "United States" + ], + "east": 146.0646485, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/e0/Flag_of_the_Northern_Mariana_Islands.svg", + "lat": 15.0979, + "lng": 145.6739, + "name": "Northern Mariana Islands", + "north": 20.5534826, + "region": "Micronesia", + "south": 14.1103823, + "west": 144.886365 + }, + { + "area": 2456799235.0730696, + "code": "MQ", + "continent": "South America", + "dependency": [ + "France" + ], + "east": -60.8105278, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/c/c3/Flag_of_France.svg", + "lat": 14.641528, + "lng": -61.024174, + "name": "Martinique", + "north": 14.8784506, + "region": "Caribbean", + "south": 14.3886471, + "west": -61.2288666 + }, + { + "area": 1776283271981.1113, + "code": "MR", + "continent": "Africa", + "east": -4.8333343, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/43/Flag_of_Mauritania.svg", + "languages": [ + "Hassanya" + ], + "lat": 21.00789, + "lng": -10.940835, + "name": "Mauritania", + "north": 27.2944447, + "region": "Western Africa", + "south": 14.721273, + "west": -17.0701337 + }, + { + "area": 172028066.88426006, + "code": "MS", + "continent": "South America", + "dependency": [ + "United Kingdom" + ], + "east": -62.1441758, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d0/Flag_of_Montserrat.svg", + "lat": 16.742498, + "lng": -62.187366, + "name": "Montserrat", + "north": 16.8240519, + "region": "Caribbean", + "south": 16.674821, + "west": -62.241322 + }, + { + "area": 1086681617.3557851, + "code": "MT", + "continent": "Europe", + "east": 14.5755001, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/7/73/Flag_of_Malta.svg", + "languages": [ + "Maltese" + ], + "lat": 35.937496, + "lng": 14.375416, + "name": "Malta", + "north": 36.0821467, + "region": "Southern Europe", + "south": 35.805811, + "west": 14.1835259 + }, + { + "area": 851215363747.2188, + "code": "MU", + "continent": "Africa", + "east": 63.5035945, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/7/77/Flag_of_Mauritius.svg", + "lat": -20.348404, + "lng": 57.552152, + "name": "Mauritius", + "north": -10.3192548, + "region": "Eastern Africa", + "south": -20.5255121, + "west": 56.5127181 + }, + { + "area": 104345084113.85146, + "code": "MV", + "continent": "Asia", + "east": 73.7192702, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/0f/Flag_of_Maldives.svg", + "lat": 3.9870284, + "lng": 73.4977747, + "name": "Maldives", + "north": 7.1062798, + "region": "Southern Asia", + "south": -0.7035846, + "west": 72.6385815 + }, + { + "area": 303848886083.1222, + "code": "MW", + "continent": "Africa", + "east": 35.9241664, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d1/Flag_of_Malawi.svg", + "languages": [ + "Nyanja" + ], + "lat": -13.254308, + "lng": 34.301525, + "name": "Malawi", + "north": -9.3671539, + "region": "Eastern Africa", + "south": -17.1352784, + "west": 32.6788891 + }, + { + "area": 6511477391320.134, + "code": "MX", + "continent": "South America", + "east": -86.7105711, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/fc/Flag_of_Mexico.svg", + "languages": [ + "Maya" + ], + "lat": 23.634501, + "lng": -102.552784, + "name": "Mexico", + "north": 32.7187631, + "region": "Central America", + "south": 14.534548, + "west": -118.383462 + }, + { + "area": 1578205782977.5474, + "code": "MY", + "continent": "Asia", + "east": 119.2658119, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/66/Flag_of_Malaysia.svg", + "languages": [ + "Malay" + ], + "lat": 4.210484, + "lng": 101.975766, + "name": "Malaysia", + "north": 7.363468, + "region": "South-Eastern Asia", + "south": 0.8538209, + "west": 99.640573 + }, + { + "area": 2038055757698.173, + "code": "MZ", + "continent": "Africa", + "east": 40.8391213, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d0/Flag_of_Mozambique.svg", + "independence": { + "country": [ + "Portugal" + ], + "date": "1975-06-25" + }, + "lat": -18.665695, + "lng": 35.529562, + "name": "Mozambique", + "north": -10.471202, + "region": "Eastern Africa", + "south": -26.8681086, + "west": 30.2155496 + }, + { + "area": 1851220222890.3416, + "code": "NA", + "continent": "Africa", + "created": { + "country": [ + "South Africa" + ], + "created": "split", + "date": "1990-05-21" + }, + "east": 25.2617519, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/00/Flag_of_Namibia.svg", + "lat": -22.95764, + "lng": 18.49041, + "name": "Namibia", + "north": -16.9634854, + "region": "Southern Africa", + "south": -28.9706387, + "west": 11.7242468 + }, + { + "area": 176206323767.27075, + "code": "NC", + "continent": "Oceania", + "dependency": [ + "France" + ], + "east": 168.1336819, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/23/Flag_of_New_Caledonia.svg", + "lat": -20.904305, + "lng": 165.618042, + "name": "New Caledonia", + "north": -19.5395087, + "region": "Melanesia", + "south": -22.8819479, + "west": 163.569721 + }, + { + "area": 2204036099775.763, + "code": "NE", + "continent": "Africa", + "east": 15.9990339, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/f4/Flag_of_Niger.svg", + "languages": [ + "Djerma" + ], + "lat": 17.607789, + "lng": 8.081666, + "name": "Niger", + "north": 23.5000002, + "region": "Western Africa", + "south": 11.693756, + "west": 0.1666672 + }, + { + "area": 123433135.97297889, + "code": "NF", + "continent": "Oceania", + "dependency": [ + "Australia" + ], + "east": 167.9969269, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/48/Flag_of_Norfolk_Island.svg", + "lat": -29.040835, + "lng": 167.954712, + "name": "Norfolk Island", + "north": -28.9953881, + "region": "Australia and New Zealand", + "south": -29.1365875, + "west": 167.9162192 + }, + { + "area": 1410466875241.0466, + "code": "NG", + "continent": "Africa", + "disputes": [ + "Biafra" + ], + "east": 14.6779814, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/7/79/Flag_of_Nigeria.svg", + "languages": [ + "Yoruba", + "Ibo", + "Hausa" + ], + "lat": 9.081999, + "lng": 8.675277, + "name": "Nigeria", + "north": 13.8856449, + "region": "Western Africa", + "south": 4.2698571, + "west": 2.676932 + }, + { + "area": 132671097583.93817, + "code": "NG-BI", + "continent": "Africa", + "disputed": [ + "Nigeria" + ], + "dissolved": { + "country": [ + "Nigeria" + ], + "date": "1970-01-75", + "dissolved": "joined" + }, + "east": 9.472486, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/82/Flag_of_Biafra.svg", + "lat": 5.58841245, + "lng": 7.4213746, + "name": "Biafra", + "north": 6.899681, + "region": "Western Africa", + "south": 4.2771439, + "west": 5.3702632 + }, + { + "area": 314889117129.67786, + "code": "NHVU", + "continent": "Oceania", + "dependency": [ + "France", + "United Kingdom" + ], + "disputes": [ + "Tafea", + "Tanna", + "Vemerana" + ], + "dissolved": { + "country": [ + "Vanuatu" + ], + "date": "1980-07-30", + "dissolved": "renamed" + }, + "east": 170.2384597, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/42/Flag_of_Anglo-French_Joint_Naval_Commission.svg", + "lat": -15.376706, + "lng": 166.959158, + "name": "New Hebrides", + "north": -13.0724554, + "region": "Melanesia", + "south": -20.2522929, + "west": 166.5417588 + }, + { + "area": 23820142756.768612, + "code": "NHVU-TF", + "continent": "Oceania", + "disputed": [ + "New Hebrides" + ], + "dissolved": { + "country": [ + "New Hebrides" + ], + "date": "1980-05-26", + "dissolved": "joined" + }, + "east": 170.237299, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/64/Tafea_Flag.svg", + "lat": -18.7237827, + "lng": 169.0645056, + "name": "Tafea", + "north": -18.6213293, + "region": "Melanesia", + "south": -20.2504909, + "west": 168.9860777 + }, + { + "area": 1134264923.2196689, + "code": "NHVU-TN", + "continent": "Oceania", + "disputed": [ + "New Hebrides" + ], + "dissolved": { + "country": [ + "New Hebrides" + ], + "date": "1974-06-29", + "dissolved": "joined" + }, + "east": 169.5043658, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/6d/Bandera_Tanna_Vanuatu.svg", + "lat": -19.5154862, + "lng": 169.3578201, + "name": "Tanna", + "north": -19.3156794, + "region": "Melanesia", + "south": -19.6575415, + "west": 169.2203521, + "wikipediaName": "Tanna (island)" + }, + { + "area": 8851103417.740273, + "code": "NHVU-VE", + "continent": "Oceania", + "disputed": [ + "New Hebrides" + ], + "dissolved": { + "country": [ + "New Hebrides" + ], + "date": "1980-07-24", + "dissolved": "joined" + }, + "east": 167.2610092, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/90/Flag_of_Vemerana.svg", + "lat": -15.3003549, + "lng": 166.9182097, + "name": "Vemerana", + "north": -14.6430503, + "region": "Melanesia", + "south": -15.6714696, + "west": 166.5414476 + }, + { + "area": 266184535261.75607, + "code": "NI", + "continent": "South America", + "east": -82.5920716, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/19/Flag_of_Nicaragua.svg", + "lat": 12.865416, + "lng": -85.207229, + "name": "Nicaragua", + "north": 15.0302755, + "region": "Central America", + "south": 10.7080549, + "west": -87.6910686 + }, + { + "area": 82535803584.80461, + "code": "NL", + "continent": "Europe", + "dependencies": [ + "Aruba", + "Bonaire, Sint Eustatius and Saba", + "Cura\u00e7ao", + "Netherlands Antilles", + "Sint Maarten" + ], + "east": 7.2275102, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/20/Flag_of_the_Netherlands.svg", + "languages": [ + "Dutch" + ], + "lat": 52.132633, + "lng": 5.291266, + "name": "Netherlands", + "north": 53.5560213, + "region": "Western Europe", + "south": 50.7503838, + "west": 3.357962 + }, + { + "area": 1872514739737.7063, + "code": "NO", + "continent": "Europe", + "dependencies": [ + "Bouvet Island", + "Peter I Island", + "Queen Maud Land", + "Svalbard and Jan Mayen", + "Antarctica" + ], + "east": 31.1682684, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d9/Flag_of_Norway.svg", + "languages": [ + "Norwegian" + ], + "lat": 60.472024, + "lng": 8.468946, + "name": "Norway", + "north": 71.1854762, + "region": "Northern Europe", + "south": 57.959599, + "west": 4.5000962 + }, + { + "area": 225274128.2496104, + "code": "NO-PI", + "continent": "Antarctica", + "dependency": [ + "Norway" + ], + "east": -90.447166, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d9/Flag_of_Norway.svg", + "lat": -68.7858824, + "lng": -90.6266444, + "name": "Peter I Island", + "north": -68.7121811, + "region": "Antarctica", + "south": -68.8936, + "west": -90.724297 + }, + { + "area": 363971215047.72833, + "code": "NP", + "continent": "Asia", + "east": 88.1992978, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/9b/Flag_of_Nepal.svg", + "languages": [ + "Nepali" + ], + "lat": 28.394857, + "lng": 84.124008, + "name": "Nepal", + "north": 30.4469452, + "region": "Southern Asia", + "south": 26.3477794, + "west": 80.0522222 + }, + { + "area": 2278006059305.4453, + "code": "NQAQ", + "continent": "Antarctica", + "dependency": [ + "Norway" + ], + "east": 44.6333333333, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d9/Flag_of_Norway.svg", + "lat": -72.5255643899, + "lng": 32.3166666667, + "name": "Queen Maud Land", + "north": -60, + "region": "Antarctica", + "south": -85.0511287798, + "west": 20 + }, + { + "area": 31542670.03488976, + "code": "NR", + "continent": "Oceania", + "east": 166.9589281, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/30/Flag_of_Nauru.svg", + "lat": -0.522778, + "lng": 166.931503, + "name": "Nauru", + "north": -0.5026395, + "region": "Micronesia", + "south": -0.5541894, + "west": 166.9095486 + }, + { + "area": 5015092061.62771, + "code": "NTHH", + "continent": "Asia", + "disputed": [ + "Iraq", + "Saudi Arabia" + ], + "dissolved": { + "country": [ + "Iraq", + "Saudi Arabia" + ], + "date": "1991", + "dissolved": "joined" + }, + "east": 46.6395783, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/2f/Flag_of_the_United_Nations.svg", + "lat": 29.0864144, + "lng": 45.67616515, + "name": "Neutral Zone", + "north": 29.2065879, + "region": "Western Asia", + "south": 28.9662409, + "west": 44.712752, + "wikipediaName": "Saudi-Iraqi neutral zone" + }, + { + "area": 416522426.3572096, + "code": "NU", + "continent": "Oceania", + "dependency": [ + "New Zealand" + ], + "east": -169.7743248, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/01/Flag_of_Niue.svg", + "lat": -19.054445, + "lng": -169.867233, + "name": "Niue", + "north": -18.95297, + "region": "Polynesia", + "south": -19.1555664, + "west": -169.9498487 + }, + { + "area": 3909215860500.712, + "code": "NZ", + "continent": "Oceania", + "dependencies": [ + "Cook Islands", + "Niue", + "Ross Dependency", + "Tokelau", + "Antarctica" + ], + "east": -176.1542248, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/3e/Flag_of_New_Zealand.svg", + "languages": [ + "Maori" + ], + "lat": -40.900557, + "lng": 174.885971, + "name": "New Zealand", + "north": -29.2313419, + "region": "Australia and New Zealand", + "south": -52.6194185, + "west": 165.8694369 + }, + { + "area": 4623828266526.1045, + "code": "NZ-AQ", + "continent": "Antarctica", + "dependency": [ + "New Zealand" + ], + "east": -150, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/3e/Flag_of_New_Zealand.svg", + "lat": -72.5255643899, + "lng": -175, + "name": "Ross Dependency", + "north": -60, + "region": "Antarctica", + "south": -85.0511287798, + "west": 160 + }, + { + "area": 880490866102.8378, + "code": "OM", + "continent": "Asia", + "east": 59.8393974, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/dd/Flag_of_Oman.svg", + "lat": 21.512583, + "lng": 55.923255, + "name": "Oman", + "north": 26.4053947, + "region": "Western Asia", + "south": 16.650336, + "west": 52.0000018 + }, + { + "area": 176575023701.57465, + "code": "PA", + "continent": "South America", + "east": -77.158488, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/a/ab/Flag_of_Panama.svg", + "lat": 8.537981, + "lng": -80.782127, + "name": "Panama", + "north": 9.647779, + "region": "Central America", + "south": 7.2035564, + "west": -83.0522411 + }, + { + "area": 8696244928787.729, + "code": "PCHH", + "continent": "Oceania", + "dependency": [ + "United States" + ], + "dissolved": { + "country": [ + "Palau" + ], + "date": "1994-10-01", + "dissolved": "renamed" + }, + "east": 172.1701812, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/41/Flag_of_the_Trust_Territory_of_the_Pacific_Islands.svg", + "lat": 11.77731075, + "lng": 151.66970055, + "name": "Pacific Islands", + "north": 20.5534826, + "region": "Micronesia", + "south": 3.0011389, + "west": 131.1692199, + "wikipediaName": "Trust Territory of the Pacific Islands" + }, + { + "area": 2827602481279.1978, + "code": "PE", + "continent": "South America", + "east": -68.652329, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/c/cf/Flag_of_Peru.svg", + "languages": [ + "Quechua" + ], + "lat": -9.189967, + "lng": -75.015152, + "name": "Peru", + "north": -0.038777, + "region": "Southern America", + "south": -18.3515803, + "west": -81.3285041 + }, + { + "area": 2925585941758.0215, + "code": "PF", + "continent": "Oceania", + "dependency": [ + "France" + ], + "east": -138.6094017, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/db/Flag_of_French_Polynesia.svg", + "lat": -17.679742, + "lng": -149.406843, + "name": "French Polynesia", + "north": -7.8956151, + "region": "Polynesia", + "south": -23.9062409, + "west": -153.9916491 + }, + { + "area": 2474419279944.0522, + "code": "PG", + "continent": "Oceania", + "disputes": [ + "Bougainville" + ], + "east": 159.4925058, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/e3/Flag_of_Papua_New_Guinea.svg", + "independence": { + "country": [ + "Australia" + ], + "date": "1975-09-16" + }, + "languages": [ + "Korowai" + ], + "lat": -6.314993, + "lng": 143.95555, + "name": "Papua New Guinea", + "north": -0.8713195, + "region": "Melanesia", + "south": -11.6578607, + "west": 140.8419695 + }, + { + "area": 138121270013.83716, + "code": "PG-NSA", + "continent": "Oceania", + "disputed": [ + "Papua New Guinea" + ], + "dissolved": { + "country": [ + "Papua New Guinea" + ], + "date": "1998-12-24", + "dissolved": "joined" + }, + "east": 157.0857237, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/e4/Flag_of_Bougainville.svg", + "lat": -6.053602, + "lng": 155.1907309, + "name": "Bougainville", + "north": -3.10944, + "region": "Melanesia", + "south": -6.8802301, + "west": 154.1180475, + "wikipediaName": "Autonomous Region of Bougainville" + }, + { + "area": 1789816879031.1318, + "code": "PH", + "continent": "Asia", + "east": 126.6043837, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/99/Flag_of_the_Philippines.svg", + "languages": [ + "Bicolano", + "Tagalog", + "Filipino" + ], + "lat": 12.879721, + "lng": 121.774017, + "name": "Philippines", + "north": 19.5740241, + "region": "South-Eastern Asia", + "south": 4.6134443, + "west": 116.7029193 + }, + { + "area": 2422273814248.002, + "code": "PK", + "continent": "Asia", + "dependencies": [ + "Azad Kashmir", + "Gilgit-Baltistan" + ], + "east": 77.8356668, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/32/Flag_of_Pakistan.svg", + "languages": [ + "Sindhi", + "Urdu" + ], + "lat": 30.375321, + "lng": 69.345116, + "name": "Pakistan", + "north": 37.084107, + "region": "Southern Asia", + "south": 23.6946946, + "west": 60.8729721 + }, + { + "area": 45509111052.29749, + "code": "PK-JK", + "continent": "Asia", + "dependency": [ + "Pakistan" + ], + "east": 75.2642401, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/4d/Flag_of_Azad_Kashmir.svg", + "lat": 33.8866588, + "lng": 73.9359821, + "name": "Azad Kashmir", + "north": 35.1311016, + "region": "Southern Asia", + "south": 32.7637389, + "west": 73.394078 + }, + { + "area": 137718195471.22104, + "code": "PK-NA", + "continent": "Asia", + "dependency": [ + "Pakistan" + ], + "east": 77.8293243, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/37/Flag_of_Gilgit-Baltistan_United_Movement.svg", + "lat": 35.952035, + "lng": 74.5931921, + "name": "Gilgit-Baltistan", + "north": 37.0841069, + "region": "Southern Asia", + "south": 34.5106098, + "west": 72.5046597, + "wikipediaName": "Gilgit\u2013Baltistan" + }, + { + "area": 446716337927.05286, + "code": "PL", + "continent": "Europe", + "east": 24.1458931, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/1/12/Flag_of_Poland.svg", + "languages": [ + "Polish" + ], + "lat": 51.919438, + "lng": 19.145136, + "name": "Poland", + "north": 54.8358123, + "region": "Eastern Europe", + "south": 49.0020252, + "west": 14.1228641 + }, + { + "area": 958418242.0384462, + "code": "PM", + "continent": "North America", + "dependency": [ + "France" + ], + "east": -56.1189376, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/7/74/Flag_of_Saint-Pierre_and_Miquelon.svg", + "lat": 46.8852, + "lng": -56.3159, + "name": "Saint Pierre and Miquelon", + "north": 47.1442704, + "region": "Northern America", + "south": 46.7491058, + "west": -56.405632 + }, + { + "area": 78563020813.92622, + "code": "PN", + "continent": "Oceania", + "dependency": [ + "United Kingdom" + ], + "east": -124.7721577, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/88/Flag_of_the_Pitcairn_Islands.svg", + "imdbName": "Pitcairn", + "lat": -24.3764907, + "lng": -128.3243466, + "name": "Pitcairn Islands", + "north": -23.9144684, + "region": "Polynesia", + "south": -25.0798075, + "west": -130.7507388 + }, + { + "area": 20352524871.789093, + "code": "PR", + "continent": "South America", + "dependency": [ + "United States" + ], + "east": -65.2211099, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/28/Flag_of_Puerto_Rico.svg", + "lat": 18.220833, + "lng": -66.590149, + "name": "Puerto Rico", + "north": 18.5160099, + "region": "Caribbean", + "south": 17.8814286, + "west": -67.9455471 + }, + { + "area": 19000981583.38278, + "code": "PS", + "continent": "Asia", + "east": 35.5740521, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/00/Flag_of_Palestine.svg", + "googleName": "Palestinian Territories", + "imdbName": "Occupied Palestinian Territory", + "lat": 31.952162, + "lng": 35.233154, + "name": "Palestine", + "north": 32.5520999, + "region": "Western Asia", + "south": 31.219691, + "west": 34.2187187, + "wikipediaName": "Palestinian territories" + }, + { + "area": 2408817279130.2983, + "code": "PT", + "continent": "Europe", + "east": -6.1902091, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/5/5c/Flag_of_Portugal.svg", + "languages": [ + "Portuguese" + ], + "lat": 39.399872, + "lng": -8.224454, + "name": "Portugal", + "north": 42.1542048, + "region": "Southern Europe", + "south": 32.40374, + "west": -31.275158 + }, + { + "area": 1404904017332.7883, + "code": "PUUM", + "continent": "Oceania", + "dependency": [ + "United States" + ], + "dissolved": { + "country": [ + "United States Minor Outlying Islands" + ], + "date": "1986", + "dissolved": "merged" + }, + "east": -160.0045781, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/e2/Flag_of_the_United_States_%28Pantone%29.svg", + "lat": 3.02849705, + "lng": -168.31455555, + "name": "United States Miscellaneous Pacific Islands", + "north": 6.4460001, + "region": "Polynesia", + "south": -0.389006, + "west": -176.624533 + }, + { + "area": 223039857524.5294, + "code": "PW", + "continent": "Oceania", + "created": { + "country": [ + "Pacific Islands" + ], + "created": "renamed", + "date": "1994-10-01" + }, + "east": 134.7210985, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/48/Flag_of_Palau.svg", + "independence": { + "country": [ + "United States" + ], + "date": "1994-10-01" + }, + "lat": 7.51498, + "lng": 134.58252, + "name": "Palau", + "north": 8.0940234, + "region": "Micronesia", + "south": 3.0011389, + "west": 131.1692199 + }, + { + "area": 790119534175.5375, + "code": "PY", + "continent": "South America", + "east": -54.258562, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/27/Flag_of_Paraguay.svg", + "languages": [ + "Guarani" + ], + "lat": -23.442503, + "lng": -58.443832, + "name": "Paraguay", + "north": -19.2877065, + "region": "Southern America", + "south": -27.5883343, + "west": -62.6380511 + }, + { + "area": 3095516473.858264, + "code": "PZPA", + "continent": "South America", + "dependency": [ + "United States" + ], + "dissolved": { + "country": [ + "Panama" + ], + "date": "1979-10-01", + "dissolved": "joined" + }, + "east": -79.5183885, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/b0/Panama_Canal_Zone_Flag.png", + "lat": 9.15749335, + "lng": -79.7708426, + "name": "Panama Canal Zone", + "north": 9.4080584, + "region": "Central America", + "south": 8.9069283, + "west": -80.0232967 + }, + { + "area": 17127168330.193848, + "code": "QA", + "continent": "Asia", + "east": 51.6432601, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/65/Flag_of_Qatar.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1971-09-03" + }, + "lat": 25.354826, + "lng": 51.183884, + "name": "Qatar", + "north": 26.1830927, + "region": "Western Asia", + "south": 24.471118, + "west": 50.7500553 + }, + { + "area": 3712139898.917095, + "code": "RE", + "continent": "Africa", + "dependency": [ + "France" + ], + "east": 55.8365536, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/05/Proposed_flag_of_R%C3%A9union_%28ARF%29.svg", + "lat": -21.115141, + "lng": 55.536384, + "name": "R\u00e9union", + "north": -20.8717557, + "region": "Eastern Africa", + "south": -21.389622, + "west": 55.2164053 + }, + { + "area": 624886303271.2074, + "code": "RHZW", + "continent": "Africa", + "created": { + "country": [ + "Zimbabwe Rhodesia" + ], + "created": "renamed", + "date": "1979-06-01" + }, + "dependency": [ + "United Kingdom" + ], + "disputes": [ + "Rhodesia", + "Zimbabwe Rhodesia" + ], + "dissolved": { + "country": [ + "Zimbabwe" + ], + "date": "1980-04-18", + "dissolved": "renamed" + }, + "east": 33.0682357, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/a/af/Flag_of_Southern_Rhodesia.svg", + "lat": -19.015438, + "lng": 29.154857, + "name": "Southern Rhodesia", + "north": -15.609319, + "region": "Eastern Africa", + "south": -22.4245232, + "west": 25.237368 + }, + { + "area": 624886303271.2074, + "code": "RHZW-RH", + "continent": "Africa", + "disputed": [ + "Southern Rhodesia" + ], + "dissolved": { + "country": [ + "Zimbabwe Rhodesia" + ], + "date": "1979-06-01", + "dissolved": "renamed" + }, + "east": 33.0682357, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/e1/Flag_of_Rhodesia.svg", + "lat": -19.015438, + "lng": 29.154857, + "name": "Rhodesia", + "north": -15.609319, + "region": "Eastern Africa", + "south": -22.4245232, + "west": 25.237368 + }, + { + "area": 624886303271.2074, + "code": "RHZW-ZR", + "continent": "Africa", + "created": { + "country": [ + "Rhodesia" + ], + "created": "renamed", + "date": "1979-06-01" + }, + "disputed": [ + "Southern Rhodesia" + ], + "dissolved": { + "country": [ + "Southern Rhodesia" + ], + "date": "1979-06-01", + "dissolved": "renamed" + }, + "east": 33.0682357, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/3f/Flag_of_Zimbabwe_Rhodesia.svg", + "lat": -19.015438, + "lng": 29.154857, + "name": "Zimbabwe Rhodesia", + "north": -15.609319, + "region": "Eastern Africa", + "south": -22.4245232, + "west": 25.237368 + }, + { + "area": 380064466914.12103, + "code": "RO", + "continent": "Europe", + "east": 29.7571015, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/7/73/Flag_of_Romania.svg", + "languages": [ + "Romanian", + "Romany" + ], + "lat": 45.943161, + "lng": 24.96676, + "name": "Romania", + "north": 48.265274, + "region": "Eastern Europe", + "south": 43.6190676, + "west": 20.2617593 + }, + { + "area": 146496588340.385, + "code": "RS", + "continent": "Europe", + "created": { + "country": [ + "Serbia and Montenegro" + ], + "created": "merged", + "date": "2006-06-05" + }, + "disputes": [ + "Kosovo" + ], + "east": 23.0063915, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/ff/Flag_of_Serbia.svg", + "languages": [ + "Serbian" + ], + "lat": 44.016521, + "lng": 21.005859, + "name": "Serbia", + "north": 46.1894461, + "region": "Southern Europe", + "south": 42.2315029, + "west": 18.8385221 + }, + { + "area": 40311984391065.12, + "code": "RU", + "continent": "Europe", + "created": { + "country": [ + "Soviet Union" + ], + "created": "renamed", + "date": "1991-12-25" + }, + "disputes": [ + "Chechnia" + ], + "east": -169.0452862, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/f/f3/Flag_of_Russia.svg", + "languages": [ + "Tatar", + "Russian", + "Chechen", + "Khanty" + ], + "lat": 61.52401, + "lng": 105.318756, + "name": "Russia", + "north": 81.8558999, + "region": "Eastern Europe", + "south": 41.185353, + "west": 19.6405525 + }, + { + "area": 25331592066.691013, + "code": "RU-CE", + "continent": "Europe", + "disputed": [ + "Russia" + ], + "dissolved": { + "country": [ + "Russia" + ], + "date": "2000-02-06", + "dissolved": "joined" + }, + "east": 46.6587, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d6/Flag_of_Chechen_Republic_of_Ichkeria.svg", + "lat": 43.4023301, + "lng": 45.7187468, + "name": "Chechnia", + "north": 44.0124, + "region": "Eastern Europe", + "south": 42.4747, + "west": 44.8337, + "wikipediaName": "Chechen Republic of Ichkeria" + }, + { + "area": 45227905253.20613, + "code": "RW", + "continent": "Africa", + "east": 30.8994008, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/17/Flag_of_Rwanda.svg", + "lat": -1.940278, + "lng": 29.873888, + "name": "Rwanda", + "north": -1.0475717, + "region": "Eastern Africa", + "south": -2.8398397, + "west": 28.8617547 + }, + { + "area": 3751482647024.711, + "code": "SA", + "continent": "Asia", + "disputes": [ + "Neutral Zone" + ], + "east": 55.6666999, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/0d/Flag_of_Saudi_Arabia.svg", + "languages": [ + "Arabic" + ], + "lat": 23.885942, + "lng": 45.079162, + "name": "Saudi Arabia", + "north": 32.154284, + "region": "Western Asia", + "south": 16.379528, + "west": 34.5489979 + }, + { + "area": 760523611659.6083, + "code": "SB", + "continent": "Oceania", + "east": 167.2830811, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/7/74/Flag_of_the_Solomon_Islands.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1978-07-07" + }, + "lat": -9.64571, + "lng": 160.156194, + "name": "Solomon Islands", + "north": -6.5892403, + "region": "Melanesia", + "south": -11.8616847, + "west": 155.4862405 + }, + { + "area": 746162640467.2219, + "code": "SC", + "continent": "Africa", + "east": 56.294294, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/fc/Flag_of_Seychelles.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1976-06-29" + }, + "lat": -4.679574, + "lng": 55.491977, + "name": "Seychelles", + "north": -4.2097858, + "region": "Eastern Africa", + "south": -10.2270331, + "west": 46.2029599 + }, + { + "area": 2569708698803.2373, + "code": "SD", + "continent": "Africa", + "east": 38.5842192, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/01/Flag_of_Sudan.svg", + "lat": 12.862807, + "lng": 30.217636, + "name": "Sudan", + "north": 22.2249184, + "region": "Northern Africa", + "south": 9.3472209, + "west": 21.814939 + }, + { + "area": 1044765059535.7197, + "code": "SE", + "continent": "Europe", + "east": 24.1665923, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/4/4c/Flag_of_Sweden.svg", + "languages": [ + "Swedish" + ], + "lat": 60.128161, + "lng": 18.643501, + "name": "Sweden", + "north": 69.0600236, + "region": "Northern Europe", + "south": 55.3367024, + "west": 10.9631866 + }, + { + "area": 1810846354.6073165, + "code": "SG", + "continent": "Asia", + "east": 104.0856805, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/48/Flag_of_Singapore.svg", + "lat": 1.352083, + "lng": 103.819836, + "name": "Singapore", + "north": 1.4708809, + "region": "South-Eastern Asia", + "south": 1.166398, + "west": 103.6056246 + }, + { + "area": 2922147232484.421, + "code": "SH", + "continent": "Africa", + "dependencies": [ + "Ascension", + "Tristan da Cunha" + ], + "dependency": [ + "United Kingdom" + ], + "east": -5.6786442, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/00/Flag_of_Saint_Helena.svg", + "imdbName": "Saint Helena", + "lat": -22.6614639, + "lng": -10.051074, + "name": "Saint Helena, Ascension and Tristan da Cunha", + "north": -7.8876128, + "region": "Western Africa", + "south": -37.435315, + "west": -14.4235038 + }, + { + "area": 40410000316.55934, + "code": "SI", + "continent": "Europe", + "created": { + "country": [ + "Yugoslavia" + ], + "created": "split", + "date": "1991-06-25" + }, + "east": 16.6104836, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/f0/Flag_of_Slovenia.svg", + "languages": [ + "Slovenian" + ], + "lat": 46.151241, + "lng": 14.995463, + "name": "Slovenia", + "north": 46.8766467, + "region": "Southern Europe", + "south": 45.421542, + "west": 13.375546 + }, + { + "area": 1482887848907.3154, + "code": "SITH", + "continent": "Asia", + "dissolved": { + "country": [ + "Thailand" + ], + "date": "1939-06-23", + "dissolved": "renamed" + }, + "east": 105.636812, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/dd/State_Flag_of_Thailand_%281916%29.svg", + "lat": 15.870032, + "lng": 100.992541, + "name": "Siam", + "north": 20.465143, + "region": "South-Eastern Asia", + "south": 5.612851, + "west": 97.343396 + }, + { + "area": 1290692178197.8298, + "code": "SJ", + "continent": "Europe", + "dependency": [ + "Norway" + ], + "east": 33.497093, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d9/Flag_of_Norway.svg", + "lat": 77.553604, + "lng": 23.670272, + "name": "Svalbard and Jan Mayen", + "north": 80.834053, + "region": "Northern Europe", + "south": 70.827446, + "west": -9.07814 + }, + { + "area": 88196720093.83124, + "code": "SK", + "continent": "Europe", + "created": { + "country": [ + "Czechoslovakia" + ], + "created": "merged", + "date": "1993-01-01" + }, + "east": 22.5589339, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/e6/Flag_of_Slovakia.svg", + "languages": [ + "Slovak" + ], + "lat": 48.669026, + "lng": 19.699024, + "name": "Slovakia", + "north": 49.6138051, + "region": "Eastern Europe", + "south": 47.7313888, + "west": 16.8331821 + }, + { + "area": 10423678348.427942, + "code": "SKIN", + "continent": "Asia", + "dissolved": { + "country": [ + "India" + ], + "date": "1975-05-16", + "dissolved": "joined" + }, + "east": 88.9108059, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/1e/Flag_of_Sikkim_monarchy.svg", + "lat": 27.7306273, + "lng": 88.633784, + "name": "Sikkim", + "north": 28.128759, + "region": "Southern Asia", + "south": 27.079261, + "west": 88.0063541 + }, + { + "area": 115169551536.09772, + "code": "SL", + "continent": "Africa", + "east": -10.271651, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/17/Flag_of_Sierra_Leone.svg", + "languages": [ + "Mende" + ], + "lat": 8.460555, + "lng": -11.779889, + "name": "Sierra Leone", + "north": 9.9999724, + "region": "Western Africa", + "south": 6.8990253, + "west": -13.3020067 + }, + { + "area": 99401489.61355989, + "code": "SM", + "continent": "Europe", + "east": 12.5167041, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/b1/Flag_of_San_Marino.svg", + "lat": 43.94236, + "lng": 12.457777, + "name": "San Marino", + "north": 43.992075, + "region": "Southern Europe", + "south": 43.8936809, + "west": 12.4034824 + }, + { + "area": 325161203164.1628, + "code": "SN", + "continent": "Africa", + "east": -11.348607, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/fd/Flag_of_Senegal.svg", + "languages": [ + "Wolof" + ], + "lat": 14.497401, + "lng": -14.452362, + "name": "Senegal", + "north": 16.6930544, + "region": "Western Africa", + "south": 12.3072891, + "west": -17.5298482 + }, + { + "area": 1751112904601.79, + "code": "SO", + "continent": "Africa", + "disputes": [ + "Somaliland" + ], + "east": 51.4130288, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/a/a0/Flag_of_Somalia.svg", + "languages": [ + "Somali" + ], + "lat": 5.152149, + "lng": 46.199616, + "name": "Somalia", + "north": 11.9886144, + "region": "Eastern Africa", + "south": -1.6620412, + "west": 40.994373 + }, + { + "area": 178676578250.70306, + "code": "SO-SO", + "continent": "Africa", + "disputed": [ + "Somalia" + ], + "east": 47.3840332, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/4d/Flag_of_Somaliland.svg", + "lat": 9.9869867, + "lng": 45.2993862, + "name": "Somaliland", + "north": 11.477937, + "region": "Eastern Africa", + "south": 8.36641, + "west": 42.6791382 + }, + { + "area": 212428124046.85706, + "code": "SR", + "continent": "South America", + "east": -53.9510244, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/60/Flag_of_Suriname.svg", + "independence": { + "country": [ + "Netherlands" + ], + "date": "1975-11-25" + }, + "lat": 3.919305, + "lng": -56.027783, + "name": "Suriname", + "north": 6.0092832, + "region": "Southern America", + "south": 1.837306, + "west": -58.0705059 + }, + { + "area": 1341809135383.3242, + "code": "SS", + "continent": "Africa", + "created": { + "country": [ + "Sudan" + ], + "created": "split", + "date": "2011-07-09" + }, + "east": 35.9489972, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/7/7a/Flag_of_South_Sudan.svg", + "lat": 7.9630921, + "lng": 30.1589303, + "name": "South Sudan", + "north": 12.2363886, + "region": "Northern Africa", + "south": 3.4889804, + "west": 23.4408493 + }, + { + "area": 21313876345.39563, + "code": "ST", + "continent": "Africa", + "east": 7.4630641, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/4f/Flag_of_Sao_Tome_and_Principe.svg", + "imdbName": "Sao Tome and Principe", + "independence": { + "country": [ + "Portugal" + ], + "date": "1975-07-12" + }, + "lat": 0.18636, + "lng": 6.613081, + "name": "S\u00e3o Tom\u00e9 and Pr\u00edncipe", + "north": 1.7017723, + "region": "Middle Africa", + "south": -0.0140044, + "west": 6.4604759 + }, + { + "area": 50417565077338.46, + "code": "SUHH", + "continent": "Europe", + "dependencies": [ + "Byelorussian Soviet Socialist Republic", + "Ukrainian Soviet Socialist Republic" + ], + "dissolved": { + "country": [ + "Russia" + ], + "date": "1991-12-25", + "dissolved": "renamed" + }, + "east": -169.0452862, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/a/a9/Flag_of_the_Soviet_Union.svg", + "lat": 58.49232995, + "lng": 105.29763315, + "name": "Soviet Union", + "north": 81.8558999, + "region": "Eastern Europe", + "south": 35.12876, + "west": 19.6405525 + }, + { + "area": 38076120767.46907, + "code": "SV", + "continent": "South America", + "east": -87.6837516, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/34/Flag_of_El_Salvador.svg", + "lat": 13.794185, + "lng": -88.89653, + "name": "El Salvador", + "north": 14.4505567, + "region": "Central America", + "south": 13.1554312, + "west": -90.1268106 + }, + { + "area": 88219949.20349692, + "code": "SX", + "continent": "South America", + "created": { + "country": [ + "Netherlands Antilles" + ], + "created": "merged", + "date": "2010-10-10" + }, + "dependency": [ + "Netherlands" + ], + "east": -63.0124785, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d3/Flag_of_Sint_Maarten.svg", + "lat": 18.0360643, + "lng": -63.0729747, + "name": "Sint Maarten", + "north": 18.0670042, + "region": "Caribbean", + "south": 18.0051244, + "west": -63.1334709 + }, + { + "area": 339302250446.3957, + "code": "SY", + "continent": "Asia", + "east": 42.376309, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/5/53/Flag_of_Syria.svg", + "languages": [ + "Aramaic" + ], + "lat": 34.802075, + "lng": 38.996815, + "name": "Syria", + "north": 37.320569, + "region": "Western Asia", + "south": 32.311136, + "west": 35.7165956 + }, + { + "area": 23821894148.669605, + "code": "SZ", + "continent": "Africa", + "east": 32.1348445, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/1e/Flag_of_Swaziland.svg", + "lat": -26.522503, + "lng": 31.465866, + "name": "Swaziland", + "north": -25.7185194, + "region": "Southern Africa", + "south": -27.3173633, + "west": 30.7910943 + }, + { + "area": 1800697070.381934, + "code": "TA", + "continent": "Africa", + "dependency": [ + "Saint Helena, Ascension and Tristan da Cunha" + ], + "east": -12.2170051, + "exception": true, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/89/Flag_of_Tristan_da_Cunha.svg", + "lat": -37.1160362, + "lng": -12.283989, + "name": "Tristan da Cunha", + "north": -37.0620265, + "region": "Western Africa", + "south": -37.435315, + "west": -12.7060318 + }, + { + "area": 12393865294.089338, + "code": "TC", + "continent": "South America", + "dependency": [ + "United Kingdom" + ], + "east": -71.0860034, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/a/a0/Flag_of_the_Turks_and_Caicos_Islands.svg", + "lat": 21.694025, + "lng": -71.797928, + "name": "Turks and Caicos Islands", + "north": 21.9623502, + "region": "Caribbean", + "south": 21.1921745, + "west": -72.4824716 + }, + { + "area": 2006647807098.5884, + "code": "TD", + "continent": "Africa", + "east": 24.0000011, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/4b/Flag_of_Chad.svg", + "lat": 15.454166, + "lng": 18.732207, + "name": "Chad", + "north": 23.449235, + "region": "Middle Africa", + "south": 7.442975, + "west": 13.4699999 + }, + { + "area": 62334526361014.82, + "code": "TF", + "continent": "Antarctica", + "created": { + "country": [ + "French Southern and Antarctic Territories" + ], + "created": "merged", + "date": "1979" + }, + "dependency": [ + "France" + ], + "east": -175.037445, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/a/a7/Flag_of_the_French_Southern_and_Antarctic_Lands.svg", + "lat": -29.91833755, + "lng": 110.28232725, + "name": "French Southern Territories", + "north": -10.0971059, + "region": "Antarctica", + "south": -49.7395692, + "west": 35.6020995, + "wikipediaName": "French Southern Lands" + }, + { + "area": 120255823745.81682, + "code": "TG", + "continent": "Africa", + "east": 1.8090501, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/68/Flag_of_Togo.svg", + "lat": 8.619543, + "lng": 0.824782, + "name": "Togo", + "north": 11.1394957, + "region": "Western Africa", + "south": 6.1123578, + "west": -0.1440418 + }, + { + "area": 1482887848907.3154, + "code": "TH", + "continent": "Asia", + "created": { + "country": [ + "Siam" + ], + "created": "renamed", + "date": "1939-06-23" + }, + "east": 105.636812, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/a/a9/Flag_of_Thailand.svg", + "languages": [ + "Thai" + ], + "lat": 15.870032, + "lng": 100.992541, + "name": "Thailand", + "north": 20.465143, + "region": "South-Eastern Asia", + "south": 5.612851, + "west": 97.343396 + }, + { + "area": 329522215187.65686, + "code": "TJ", + "continent": "Asia", + "created": { + "country": [ + "Soviet Union" + ], + "created": "split", + "date": "1991-09-09" + }, + "east": 75.1539564, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d0/Flag_of_Tajikistan.svg", + "languages": [ + "Tajik" + ], + "lat": 38.861034, + "lng": 71.276093, + "name": "Tajikistan", + "north": 41.044367, + "region": "Central Asia", + "south": 36.6719898, + "west": 67.3420121 + }, + { + "area": 14977026562.249058, + "code": "TK", + "continent": "Oceania", + "dependency": [ + "New Zealand" + ], + "east": -171.1811113, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/8e/Flag_of_Tokelau.svg", + "lat": -9.2002, + "lng": -171.8484, + "name": "Tokelau", + "north": -8.531454, + "region": "Polynesia", + "south": -9.4448709, + "west": -172.5207405 + }, + { + "area": 55637000543.564026, + "code": "TL", + "continent": "Asia", + "created": { + "country": [ + "East Timor" + ], + "created": "renamed", + "date": "2002-05-20" + }, + "east": 127.3416347, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/26/Flag_of_East_Timor.svg", + "lat": -8.874217, + "lng": 125.727539, + "name": "Timor-Leste", + "north": -8.1268067, + "region": "South-Eastern Asia", + "south": -9.504195, + "west": 124.0429847 + }, + { + "area": 1053053629022.3019, + "code": "TM", + "continent": "Asia", + "created": { + "country": [ + "Soviet Union" + ], + "created": "split", + "date": "1991-10-27" + }, + "east": 66.7073531, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/1b/Flag_of_Turkmenistan.svg", + "languages": [ + "Turkmen" + ], + "lat": 38.969719, + "lng": 59.556278, + "name": "Turkmenistan", + "north": 42.798844, + "region": "Central Asia", + "south": 35.12876, + "west": 52.4477432 + }, + { + "area": 298726938752.1581, + "code": "TN", + "continent": "Africa", + "east": 11.5992174, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/c/ce/Flag_of_Tunisia.svg", + "lat": 33.886917, + "lng": 9.537499, + "name": "Tunisia", + "north": 37.347132, + "region": "Northern Africa", + "south": 30.2280336, + "west": 7.5223135 + }, + { + "area": 137289778815.3862, + "code": "TO", + "continent": "Oceania", + "east": -173.7024841, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/9a/Flag_of_Tonga.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1970-06-04" + }, + "languages": [ + "Tonga (Tonga Islands)" + ], + "lat": -21.178986, + "lng": -175.198242, + "name": "Tonga", + "north": -15.5663926, + "region": "Polynesia", + "south": -21.4734606, + "west": -175.6813217 + }, + { + "area": 55637000543.564026, + "code": "TPTL", + "continent": "Asia", + "disputed": [ + "Indonesia" + ], + "dissolved": { + "country": [ + "Timor-Leste" + ], + "date": "2002-05-20", + "dissolved": "renamed" + }, + "east": 127.3416347, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/26/Flag_of_East_Timor.svg", + "lat": -8.874217, + "lng": 125.727539, + "name": "East Timor", + "north": -8.1268067, + "region": "South-Eastern Asia", + "south": -9.504195, + "west": 124.0429847 + }, + { + "area": 1161989188222.267, + "code": "TR", + "continent": "Asia", + "east": 44.818128, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/b4/Flag_of_Turkey.svg", + "languages": [ + "Turkish", + "Kurdish" + ], + "lat": 38.963745, + "lng": 35.243322, + "name": "Turkey", + "north": 42.1062391, + "region": "Western Asia", + "south": 35.8076804, + "west": 25.6636372 + }, + { + "area": 23111708729.84678, + "code": "TT", + "continent": "South America", + "east": -60.4924177, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/64/Flag_of_Trinidad_and_Tobago.svg", + "lat": 10.691803, + "lng": -61.222503, + "name": "Trinidad and Tobago", + "north": 11.3625357, + "region": "Caribbean", + "south": 10.0431694, + "west": -61.9310689 + }, + { + "area": 241113761289.51068, + "code": "TV", + "continent": "Oceania", + "created": { + "country": [ + "Ellice Islands" + ], + "created": "renamed", + "date": "1978-10-01" + }, + "east": 179.8710608, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/38/Flag_of_Tuvalu.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1978-10-01" + }, + "lat": -10.7280717, + "lng": 179.4726562, + "name": "Tuvalu", + "north": -5.64223, + "region": "Polynesia", + "south": -10.8009338, + "west": 176.0588907 + }, + { + "area": 350341930270.0106, + "code": "TW", + "continent": "Asia", + "east": 122.0069052, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/7/72/Flag_of_the_Republic_of_China.svg", + "lat": 23.69781, + "lng": 120.960515, + "name": "Taiwan", + "north": 26.3873533, + "region": "Eastern Asia", + "south": 20.5637908, + "west": 116.7118601, + "wikipediaName": "Republic of China" + }, + { + "area": 1471700292824.9873, + "code": "TZ", + "continent": "Africa", + "east": 40.4449653, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/38/Flag_of_Tanzania.svg", + "lat": -6.369028, + "lng": 34.888822, + "name": "Tanzania", + "north": -0.984397, + "region": "Eastern Africa", + "south": -11.7612536, + "west": 29.34 + }, + { + "area": 1189264281171.615, + "code": "UA", + "continent": "Europe", + "created": { + "country": [ + "Ukrainian Soviet Socialist Republic" + ], + "created": "renamed", + "date": "1991-08-24" + }, + "east": 40.2285809, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/49/Flag_of_Ukraine.svg", + "independence": { + "country": [ + "Soviet Union" + ], + "date": "1991-08-24" + }, + "languages": [ + "Ukrainian" + ], + "lat": 48.379433, + "lng": 31.16558, + "name": "Ukraine", + "north": 52.379581, + "region": "Eastern Europe", + "south": 44.386463, + "west": 22.1357201 + }, + { + "area": 1189264281171.615, + "code": "UAUA", + "continent": "Europe", + "dependency": [ + "Soviet Union" + ], + "dissolved": { + "country": [ + "Ukraine" + ], + "date": "1991-08-24", + "dissolved": "renamed" + }, + "east": 40.2285809, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/a/a6/Flag_of_Ukrainian_SSR.svg", + "lat": 48.379433, + "lng": 31.16558, + "name": "Ukrainian Soviet Socialist Republic", + "north": 52.379581, + "region": "Eastern Europe", + "south": 44.386463, + "west": 22.1357201 + }, + { + "area": 385675144891.08875, + "code": "UG", + "continent": "Africa", + "disputes": [ + "Rwenzururu" + ], + "east": 35.0330493, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/4e/Flag_of_Uganda.svg", + "lat": 1.373333, + "lng": 32.290275, + "name": "Uganda", + "north": 4.2230008, + "region": "Eastern Africa", + "south": -1.4815419, + "west": 29.5734335 + }, + { + "area": 6637196376.701824, + "code": "UG-RW", + "continent": "Africa", + "disputed": [ + "Uganda" + ], + "dissolved": { + "country": [ + "Uganda" + ], + "date": "1982-08-13", + "dissolved": "joined" + }, + "east": 30.2977179, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/9/9c/Rwenzururu_flag.png", + "lat": 0.34385375, + "lng": 30.0552463, + "name": "Rwenzururu", + "north": 0.896104, + "region": "Eastern Africa", + "south": -0.2083965, + "west": 29.8127747 + }, + { + "area": 805219897437.0283, + "code": "UK", + "continent": "Europe", + "dependencies": [ + "Canton and Enderbury Islands", + "New Hebrides", + "Akrotiri and Dhekelia", + "Anguilla", + "Bermuda", + "British Antarctic Territory", + "British Honduras", + "British Indian Ocean Territory", + "British Virgin Islands", + "Cayman Islands", + "Ellice Islands", + "England", + "Falkland Islands", + "Gibraltar", + "Gilbert and Ellice Islands", + "Gilbert Islands", + "Guernsey", + "Isle of Man", + "Jersey", + "Montserrat", + "Northern Ireland", + "Pitcairn Islands", + "Saint Christopher-Nevis-Anguilla", + "Saint Helena, Ascension and Tristan da Cunha", + "Scotland", + "South Georgia and the South Sandwich Islands", + "Southern Rhodesia", + "Trucial States", + "Turks and Caicos Islands", + "Wales", + "Antarctica" + ], + "disputes": [ + "Sealand" + ], + "east": 1.7629159, + "exception": true, + "flagURL": "http://upload.wikimedia.org/wikipedia/en/a/ae/Flag_of_the_United_Kingdom.svg", + "googleName": "UK", + "languages": [ + "Cornish", + "English", + "British" + ], + "lat": 55.36275335, + "lng": -3.4434703, + "name": "United Kingdom", + "north": 60.8607515, + "region": "Northern Europe", + "south": 49.8647552, + "west": -8.6498565 + }, + { + "area": 11365264726647.027, + "code": "UM", + "continent": "Oceania", + "created": { + "country": [ + "Johnston Island", + "Midway Islands", + "United States Miscellaneous Pacific Islands", + "Wake Island" + ], + "created": "merged", + "date": "1986" + }, + "dependency": [ + "United States" + ], + "east": -160.0045781, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/e2/Flag_of_the_United_States_%28Pantone%29.svg", + "lat": 13.91304525, + "lng": -176.69358055, + "name": "United States Minor Outlying Islands", + "north": 28.2150965, + "region": "Polynesia", + "south": -0.389006, + "west": 166.617417 + }, + { + "area": 53396251601769.51, + "code": "US", + "continent": "North America", + "dependencies": [ + "Canton and Enderbury Islands", + "American Samoa", + "Guam", + "Northern Mariana Islands", + "Johnston Island", + "Midway Islands", + "Pacific Islands", + "Panama Canal Zone", + "Puerto Rico", + "United States Minor Outlying Islands", + "United States Miscellaneous Pacific Islands", + "United States Virgin Islands", + "Wake Island" + ], + "east": -66.9497608, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/e2/Flag_of_the_United_States_%28Pantone%29.svg", + "googleName": "USA", + "languages": [ + "Navajo", + "Creek", + "Cheyenne", + "Hawaiian", + "Sioux", + "Cherokee", + "American", + "Hopi", + "Shoshoni" + ], + "lat": 37.09024, + "lng": -95.712891, + "name": "United States", + "north": 71.389888, + "region": "Northern America", + "south": 18.9110642, + "west": 172.4546966 + }, + { + "area": 273721340317.7892, + "code": "UY", + "continent": "South America", + "east": -53.0779286, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/fe/Flag_of_Uruguay.svg", + "lat": -32.522779, + "lng": -55.765835, + "name": "Uruguay", + "north": -30.0852149, + "region": "Southern America", + "south": -34.9733882, + "west": -58.43915 + }, + { + "area": 1341174343594.3728, + "code": "UZ", + "continent": "Asia", + "created": { + "country": [ + "Soviet Union" + ], + "created": "split", + "date": "1991-09-01" + }, + "east": 73.148946, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/84/Flag_of_Uzbekistan.svg", + "languages": [ + "Uzbek" + ], + "lat": 41.377491, + "lng": 64.585262, + "name": "Uzbekistan", + "north": 45.590075, + "region": "Central Asia", + "south": 37.1722571, + "west": 55.9982179 + }, + { + "area": 859657.1984702328, + "code": "VA", + "continent": "Europe", + "east": 12.4584798, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/00/Flag_of_the_Vatican_City.svg", + "imdbName": "Holy See (Vatican City State)", + "lat": 41.902916, + "lng": 12.453389, + "name": "Vatican City", + "north": 41.9075614, + "region": "Southern Europe", + "south": 41.9002754, + "west": 12.445687 + }, + { + "area": 3574522769.0172334, + "code": "VC", + "continent": "South America", + "east": -61.1134244, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/6d/Flag_of_Saint_Vincent_and_the_Grenadines.svg", + "lat": 13.2533835, + "lng": -61.196251, + "name": "Saint Vincent and the Grenadines", + "north": 13.3842132, + "region": "Caribbean", + "south": 12.5326587, + "west": -61.4610171 + }, + { + "area": 505622608362.1054, + "code": "VDVN", + "continent": "Asia", + "dissolved": { + "country": [ + "Vietnam" + ], + "date": "1976-07-02", + "dissolved": "merged" + }, + "east": 108.1925689, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/6b/Flag_of_North_Vietnam_1945-1955.svg", + "lat": 19.69181855, + "lng": 105.26002, + "name": "North Vietnam", + "north": 23.3888341, + "region": "South-Eastern Asia", + "south": 15.994803, + "west": 102.3274711 + }, + { + "area": 1924084866701.1467, + "code": "VE", + "continent": "South America", + "east": -59.805666, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/06/Flag_of_Venezuela.svg", + "lat": 6.42375, + "lng": -66.58973, + "name": "Venezuela", + "north": 12.2019032, + "region": "Southern America", + "south": 0.6475291, + "west": -73.3515581 + }, + { + "area": 3020529274.913091, + "code": "VG", + "continent": "South America", + "dependency": [ + "United Kingdom" + ], + "east": -64.2704487, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/42/Flag_of_the_British_Virgin_Islands.svg", + "lat": 18.420695, + "lng": -64.639968, + "name": "British Virgin Islands", + "north": 18.7495529, + "region": "Caribbean", + "south": 18.3063328, + "west": -64.8504602 + }, + { + "area": 4527869653.723633, + "code": "VI", + "continent": "South America", + "dependency": [ + "United States" + ], + "east": -64.5654944, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/f8/Flag_of_the_United_States_Virgin_Islands.svg", + "imdbName": "US Virgin Islands", + "lat": 18.335765, + "lng": -64.896335, + "name": "United States Virgin Islands", + "north": 18.41295, + "region": "Caribbean", + "south": 17.673884, + "west": -65.0854569 + }, + { + "area": 1303975005595.8723, + "code": "VN", + "continent": "Asia", + "created": { + "country": [ + "North Vietnam", + "South Vietnam" + ], + "created": "merged", + "date": "1976-07-02" + }, + "east": 109.4689751, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/2/21/Flag_of_Vietnam.svg", + "languages": [ + "Vietnamese" + ], + "lat": 14.058324, + "lng": 108.277199, + "name": "Vietnam", + "north": 23.393395, + "region": "South-Eastern Asia", + "south": 8.4127295, + "west": 102.14441 + }, + { + "area": 532017565567.03925, + "code": "VNVN", + "continent": "Asia", + "dissolved": { + "country": [ + "Vietnam" + ], + "date": "1976-07-02", + "dissolved": "merged" + }, + "east": 109.461465, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/e9/Flag_of_South_Vietnam.svg", + "lat": 12.3190807, + "lng": 106.64693735, + "name": "South Vietnam", + "north": 16.2254319, + "region": "South-Eastern Asia", + "south": 8.4127295, + "west": 103.8324097 + }, + { + "area": 314889117129.67786, + "code": "VU", + "continent": "Oceania", + "created": { + "country": [ + "New Hebrides" + ], + "created": "renamed", + "date": "1980-07-30" + }, + "east": 170.2384597, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/b/bc/Flag_of_Vanuatu.svg", + "independence": { + "country": [ + "France", + "United Kingdom" + ], + "date": "1980-07-30" + }, + "lat": -15.376706, + "lng": 166.959158, + "name": "Vanuatu", + "north": -13.0724554, + "region": "Melanesia", + "south": -20.2522929, + "west": 166.5417588 + }, + { + "area": 29182466281.98004, + "code": "WF", + "continent": "Oceania", + "dependency": [ + "France" + ], + "east": -176.124841, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/d2/Flag_of_Wallis_and_Futuna.svg", + "lat": -14.2938, + "lng": -178.1165, + "name": "Wallis and Futuna", + "north": -13.1833201, + "region": "Polynesia", + "south": -14.3621244, + "west": -178.181752 + }, + { + "area": 19955941.345983617, + "code": "WKUM", + "continent": "Oceania", + "dependency": [ + "United States" + ], + "dissolved": { + "country": [ + "United States Minor Outlying Islands" + ], + "date": "1986", + "dissolved": "merged" + }, + "east": 166.660066, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/47/Flag_of_Wake_Island.svg", + "lat": 19.2854467, + "lng": 166.6499348, + "name": "Wake Island", + "north": 19.3096949, + "region": "Micronesia", + "south": 19.26969, + "west": 166.617417 + }, + { + "area": 10765472542.265308, + "code": "WS", + "continent": "Oceania", + "east": -171.405859, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/31/Flag_of_Samoa.svg", + "languages": [ + "Samoan" + ], + "lat": -13.759029, + "lng": -172.104629, + "name": "Samoa", + "north": -13.4344024, + "region": "Polynesia", + "south": -14.0765884, + "west": -172.7985992 + }, + { + "area": 22967893826.470978, + "code": "XK", + "continent": "Europe", + "created": { + "country": [ + "Serbia" + ], + "created": "split", + "date": "2008-02-17" + }, + "disputed": [ + "Serbia" + ], + "east": 21.7898669, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/1/1f/Flag_of_Kosovo.svg", + "googleName": "Kosova (Kosovo)", + "lat": 42.6026359, + "lng": 20.902977, + "name": "Kosovo", + "north": 43.269314, + "region": "Southern Europe", + "south": 41.852085, + "west": 20.014284, + "wikipediaName": "Republic of Kosovo" + }, + { + "area": 581768114676.5299, + "code": "YDYE", + "continent": "Asia", + "dissolved": { + "country": [ + "Yemen" + ], + "date": "1990-05-22", + "dissolved": "merged" + }, + "east": 53.0783, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/d/db/Flag_of_South_Yemen.svg", + "lat": 16.0246844, + "lng": 48.97548515, + "name": "South Yemen", + "north": 19.002331, + "region": "Western Asia", + "south": 13.0470378, + "west": 44.8726703 + }, + { + "area": 1045661358711.0955, + "code": "YE", + "continent": "Asia", + "created": { + "country": [ + "North Yemen", + "South Yemen" + ], + "created": "merged", + "date": "1990-05-22" + }, + "east": 54.5335554, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/8/89/Flag_of_Yemen.svg", + "lat": 15.552727, + "lng": 48.516388, + "name": "Yemen", + "north": 18.9996331, + "region": "Western Asia", + "south": 12.1081658, + "west": 41.8160553 + }, + { + "area": 215113232244.51578, + "code": "YEYE", + "continent": "Asia", + "dissolved": { + "country": [ + "Yemen" + ], + "date": "1990-05-22", + "dissolved": "merged" + }, + "east": 47.0087311, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/f/f6/Flag_of_North_Yemen.svg", + "lat": 15.0191335, + "lng": 45.1242575, + "name": "North Yemen", + "north": 17.4041709, + "region": "Western Asia", + "south": 12.6340961, + "west": 43.2397839, + "wikipediaName": "Yemen Arab Republic" + }, + { + "area": 1256673961.070732, + "code": "YT", + "continent": "Africa", + "dependency": [ + "France" + ], + "east": 45.3000288, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/4/4a/Flag_of_Mayotte_%28local%29.svg", + "lat": -12.8275, + "lng": 45.166244, + "name": "Mayotte", + "north": -12.6365371, + "region": "Eastern Africa", + "south": -13.0055279, + "west": 45.0181707 + }, + { + "area": 519488193285.855, + "code": "YUCS", + "continent": "Europe", + "dissolved": { + "country": [ + "Serbia and Montenegro" + ], + "date": "2003-02-04", + "dissolved": "renamed" + }, + "east": 23.034093, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/e/e7/Flag_of_the_Kingdom_of_Yugoslavia.svg", + "languages": [ + "Serbo-Croatian" + ], + "lat": 43.86521465, + "lng": 18.2048195, + "name": "Yugoslavia", + "north": 46.8766467, + "region": "Southern Europe", + "south": 40.8537826, + "west": 13.375546 + }, + { + "area": 2269556756163.599, + "code": "ZA", + "continent": "Africa", + "dependencies": [ + "Bophuthatswana", + "Ciskei", + "Transkei", + "Venda" + ], + "east": 32.8909911, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/a/af/Flag_of_South_Africa.svg", + "languages": [ + "Xhosa", + "Afrikaans", + "Zulu" + ], + "lat": -30.559482, + "lng": 22.937506, + "name": "South Africa", + "north": -22.1253868, + "region": "Southern Africa", + "south": -34.8329773, + "west": 16.4608321 + }, + { + "area": 295434292273.01605, + "code": "ZA-BO", + "continent": "Africa", + "dependency": [ + "South Africa" + ], + "dissolved": { + "country": [ + "South Africa" + ], + "date": "1994-04-27", + "dissolved": "joined" + }, + "east": 28.2828041, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/7/77/Flag_of_Bophuthatswana.svg", + "lat": -26.95380165, + "lng": 25.54969205, + "name": "Bophuthatswana", + "north": -24.5065762, + "region": "Southern Africa", + "south": -29.4010271, + "west": 22.81658 + }, + { + "area": 22412104017.53, + "code": "ZA-CI", + "continent": "Africa", + "dependency": [ + "South Africa" + ], + "dissolved": { + "country": [ + "South Africa" + ], + "date": "1994-04-27", + "dissolved": "joined" + }, + "east": 28.0353449, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/c/cc/Flag_of_Ciskei.svg", + "lat": -32.7263335, + "lng": 27.4326999, + "name": "Ciskei", + "north": -31.834457, + "region": "Southern Africa", + "south": -33.61821, + "west": 26.8300549 + }, + { + "area": 60886162683.70658, + "code": "ZA-TR", + "continent": "Africa", + "dependency": [ + "South Africa" + ], + "dissolved": { + "country": [ + "South Africa" + ], + "date": "1994-04-27", + "dissolved": "joined" + }, + "east": 30.2847061, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/05/Flag_of_Transkei.svg", + "lat": -31.1167029, + "lng": 28.5573805, + "name": "Transkei", + "north": -30.2860409, + "region": "Southern Africa", + "south": -31.9473649, + "west": 26.8300549 + }, + { + "area": 20818352544.09461, + "code": "ZA-VE", + "continent": "Africa", + "dependency": [ + "South Africa" + ], + "dissolved": { + "country": [ + "South Africa" + ], + "date": "1994-04-27", + "dissolved": "joined" + }, + "east": 31.3348961, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/3/3a/Flag_of_Venda.svg", + "lat": -23.1701895, + "lng": 30.70374495, + "name": "Venda", + "north": -22.446344, + "region": "Southern Africa", + "south": -23.894035, + "west": 30.0725938 + }, + { + "area": 1393102931629.7065, + "code": "ZM", + "continent": "Africa", + "east": 33.7022218, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/0/06/Flag_of_Zambia.svg", + "lat": -13.133897, + "lng": 27.849332, + "name": "Zambia", + "north": -8.2032836, + "region": "Eastern Africa", + "south": -18.077418, + "west": 21.9963877 + }, + { + "area": 4437461670331.977, + "code": "ZRCD", + "continent": "Africa", + "dissolved": { + "country": [ + "Democratic Republic of the Congo" + ], + "date": "1997-05-17", + "dissolved": "renamed" + }, + "east": 31.3146115, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/5/5c/Flag_of_Zaire.svg", + "lat": -4.038333, + "lng": 21.758664, + "name": "Zaire", + "north": 5.3920026, + "region": "Middle Africa", + "south": -13.459035, + "west": 12.1855092 + }, + { + "area": 624886303271.2074, + "code": "ZW", + "continent": "Africa", + "created": { + "country": [ + "Southern Rhodesia" + ], + "created": "renamed", + "date": "1980-04-18" + }, + "east": 33.0682357, + "flagURL": "http://upload.wikimedia.org/wikipedia/commons/6/6a/Flag_of_Zimbabwe.svg", + "independence": { + "country": [ + "United Kingdom" + ], + "date": "1980-04-18" + }, + "languages": [ + "Shona" + ], + "lat": -19.015438, + "lng": 29.154857, + "name": "Zimbabwe", + "north": -15.609319, + "region": "Eastern Africa", + "south": -22.4245232, + "west": 25.237368 + } +] \ No newline at end of file diff --git a/demo/static/OxJS/dev/Ox.Geo/json/locale.de.json b/demo/static/OxJS/dev/Ox.Geo/json/locale.de.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/demo/static/OxJS/dev/Ox.Geo/json/locale.de.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AC.png new file mode 100644 index 0000000..fda9b50 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AD.png new file mode 100644 index 0000000..28ff75f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-AJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-AJ.png new file mode 100644 index 0000000..77934b3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-AJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-AZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-AZ.png new file mode 100644 index 0000000..4e448c8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-AZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-DU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-DU.png new file mode 100644 index 0000000..77934b3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-DU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-FU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-FU.png new file mode 100644 index 0000000..0115ad6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-FU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-RK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-RK.png new file mode 100644 index 0000000..0becdee Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-RK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-SH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-SH.png new file mode 100644 index 0000000..0becdee Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-SH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-UQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-UQ.png new file mode 100644 index 0000000..59c9095 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE-UQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE.png new file mode 100644 index 0000000..0115ad6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AF.png new file mode 100644 index 0000000..6e9618a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AG.png new file mode 100644 index 0000000..0bb315d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AI.png new file mode 100644 index 0000000..4cb8bd6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AIDJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AIDJ.png new file mode 100644 index 0000000..c7765a9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AIDJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AL.png new file mode 100644 index 0000000..4c692ee Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AM.png new file mode 100644 index 0000000..72297fa Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ANHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ANHH.png new file mode 100644 index 0000000..f926845 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ANHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AO-CAB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AO-CAB.png new file mode 100644 index 0000000..0a35350 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AO-CAB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AO.png new file mode 100644 index 0000000..7f8813f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AQ.png new file mode 100644 index 0000000..233b730 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AR-AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AR-AQ.png new file mode 100644 index 0000000..b41cb81 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AR-AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AR.png new file mode 100644 index 0000000..aac13db Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AS.png new file mode 100644 index 0000000..ceb52b8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AT.png new file mode 100644 index 0000000..b0b45d0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AU-AC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AU-AC.png new file mode 100644 index 0000000..dab1e3c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AU-AC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AU-AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AU-AQ.png new file mode 100644 index 0000000..dab1e3c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AU-AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AU-CS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AU-CS.png new file mode 100644 index 0000000..dab1e3c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AU-CS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AU.png new file mode 100644 index 0000000..dab1e3c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AW.png new file mode 100644 index 0000000..04ef809 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AX.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AX.png new file mode 100644 index 0000000..e993ee5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AX.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AZ-NK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AZ-NK.png new file mode 100644 index 0000000..7292ac6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AZ-NK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AZ.png new file mode 100644 index 0000000..4e56683 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/AZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BA.png new file mode 100644 index 0000000..5bb047f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BB.png new file mode 100644 index 0000000..c227eb6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BD.png new file mode 100644 index 0000000..f3f2485 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BE.png new file mode 100644 index 0000000..5e85b3d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BF.png new file mode 100644 index 0000000..7dadf3b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BG.png new file mode 100644 index 0000000..c79cd33 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BH.png new file mode 100644 index 0000000..9d11752 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BI.png new file mode 100644 index 0000000..a8354f2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BJ.png new file mode 100644 index 0000000..2053d41 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BL.png new file mode 100644 index 0000000..4b9e7b0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BM.png new file mode 100644 index 0000000..7c4d4b1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BN.png new file mode 100644 index 0000000..5571222 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BO.png new file mode 100644 index 0000000..326b417 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BQ.png new file mode 100644 index 0000000..4600443 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BQAQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BQAQ.png new file mode 100644 index 0000000..80bf461 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BQAQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BR.png new file mode 100644 index 0000000..374fe38 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BS.png new file mode 100644 index 0000000..2f66dc2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BT.png new file mode 100644 index 0000000..bf6163c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BUMM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BUMM.png new file mode 100644 index 0000000..1e8b1b0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BUMM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BV.png new file mode 100644 index 0000000..88b9b5a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BW.png new file mode 100644 index 0000000..3028769 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BY.png new file mode 100644 index 0000000..924c0ac Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BYAA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BYAA.png new file mode 100644 index 0000000..124f771 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BYAA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BZ.png new file mode 100644 index 0000000..5a6190c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/BZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CA.png new file mode 100644 index 0000000..ff9d5d6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CC.png new file mode 100644 index 0000000..fdc7792 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CD.png new file mode 100644 index 0000000..f16bb20 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CF.png new file mode 100644 index 0000000..79ff0fa Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CG.png new file mode 100644 index 0000000..e580d0c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CH.png new file mode 100644 index 0000000..fac8edf Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CI.png new file mode 100644 index 0000000..75828c1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CK.png new file mode 100644 index 0000000..21d0d61 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CL-AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CL-AQ.png new file mode 100644 index 0000000..66ce6e3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CL-AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CL.png new file mode 100644 index 0000000..ab43caa Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CM.png new file mode 100644 index 0000000..a4af58f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CN.png new file mode 100644 index 0000000..fc8fa5a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CO.png new file mode 100644 index 0000000..82adcd4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CP.png new file mode 100644 index 0000000..c7765a9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CR.png new file mode 100644 index 0000000..2969333 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CSHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CSHH.png new file mode 100644 index 0000000..026fb6d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CSHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CSXX.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CSXX.png new file mode 100644 index 0000000..008e60b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CSXX.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CTKI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CTKI.png new file mode 100644 index 0000000..8f6b030 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CTKI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CU.png new file mode 100644 index 0000000..9826f9c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CV.png new file mode 100644 index 0000000..4e9337e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CW.png new file mode 100644 index 0000000..7614357 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CX.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CX.png new file mode 100644 index 0000000..6c5f9cc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CX.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CY-NC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CY-NC.png new file mode 100644 index 0000000..fd925b8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CY-NC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CY.png new file mode 100644 index 0000000..bc3ee86 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CZ.png new file mode 100644 index 0000000..026fb6d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/CZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DDDE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DDDE.png new file mode 100644 index 0000000..e0a22e6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DDDE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DE.png new file mode 100644 index 0000000..6b1593f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DEDE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DEDE.png new file mode 100644 index 0000000..6b1593f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DEDE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DG.png new file mode 100644 index 0000000..8c318c9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DJ.png new file mode 100644 index 0000000..768a6e5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DK.png new file mode 100644 index 0000000..dcfab85 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DM.png new file mode 100644 index 0000000..4f4cde4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DO.png new file mode 100644 index 0000000..91901d8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DYBJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DYBJ.png new file mode 100644 index 0000000..2053d41 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DYBJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DZ.png new file mode 100644 index 0000000..b8bdb75 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/DZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EA.png new file mode 100644 index 0000000..77208be Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EC.png new file mode 100644 index 0000000..ff1d490 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EE.png new file mode 100644 index 0000000..c670bb5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EG.png new file mode 100644 index 0000000..e092a53 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EGEG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EGEG.png new file mode 100644 index 0000000..78a4bde Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EGEG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EH.png new file mode 100644 index 0000000..ec2c306 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ER.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ER.png new file mode 100644 index 0000000..3b522b6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ER.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ES.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ES.png new file mode 100644 index 0000000..cbbc85a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ES.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ET.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ET.png new file mode 100644 index 0000000..7746fbc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ET.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EU.png new file mode 100644 index 0000000..ac52cd1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/EU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FI.png new file mode 100644 index 0000000..b418ca2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FJ.png new file mode 100644 index 0000000..6aab9cc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FK.png new file mode 100644 index 0000000..f21987e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FM.png new file mode 100644 index 0000000..34ab771 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FO.png new file mode 100644 index 0000000..8b5b93b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FQHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FQHH.png new file mode 100644 index 0000000..1cf52b3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FQHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FR-AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FR-AQ.png new file mode 100644 index 0000000..1cf52b3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FR-AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FR.png new file mode 100644 index 0000000..c7765a9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FXFR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FXFR.png new file mode 100644 index 0000000..c7765a9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/FXFR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GA.png new file mode 100644 index 0000000..faaa8af Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-AD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-AD.png new file mode 100644 index 0000000..3b0a7a0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-AD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-ENG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-ENG.png new file mode 100644 index 0000000..8d95c2d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-ENG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-NIR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-NIR.png new file mode 100644 index 0000000..28f8d20 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-NIR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-SCT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-SCT.png new file mode 100644 index 0000000..9459bc6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-SCT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-SL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-SL.png new file mode 100644 index 0000000..4eda199 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-SL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-WLS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-WLS.png new file mode 100644 index 0000000..c7510c5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB-WLS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB.png new file mode 100644 index 0000000..3b0a7a0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GBAE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GBAE.png new file mode 100644 index 0000000..0cd86eb Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GBAE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GBBZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GBBZ.png new file mode 100644 index 0000000..9e6df01 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GBBZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GBKN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GBKN.png new file mode 100644 index 0000000..17912a7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GBKN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GD.png new file mode 100644 index 0000000..87f77da Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GE-AB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GE-AB.png new file mode 100644 index 0000000..2ef346e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GE-AB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GE-SK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GE-SK.png new file mode 100644 index 0000000..5533d8e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GE-SK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GE.png new file mode 100644 index 0000000..60de6b5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GEHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GEHH.png new file mode 100644 index 0000000..8f6b030 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GEHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GEKI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GEKI.png new file mode 100644 index 0000000..8f6b030 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GEKI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GETV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GETV.png new file mode 100644 index 0000000..8f6b030 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GETV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GF.png new file mode 100644 index 0000000..eeefe02 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GG-AL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GG-AL.png new file mode 100644 index 0000000..4f80313 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GG-AL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GG-HE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GG-HE.png new file mode 100644 index 0000000..63b60a2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GG-HE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GG-SA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GG-SA.png new file mode 100644 index 0000000..a843afb Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GG-SA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GG.png new file mode 100644 index 0000000..b4b4d54 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GH.png new file mode 100644 index 0000000..64d0414 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GI.png new file mode 100644 index 0000000..2a5cf72 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GL.png new file mode 100644 index 0000000..b46d444 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GM.png new file mode 100644 index 0000000..7c0a841 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GN.png new file mode 100644 index 0000000..e3c9807 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GP.png new file mode 100644 index 0000000..c87ddc5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GQ.png new file mode 100644 index 0000000..c5dd0a0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GR.png new file mode 100644 index 0000000..d56018f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GS.png new file mode 100644 index 0000000..64e1936 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GT.png new file mode 100644 index 0000000..e336321 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GU.png new file mode 100644 index 0000000..9e4f96d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GW.png new file mode 100644 index 0000000..e8aa2c7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GY.png new file mode 100644 index 0000000..94f8733 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/GY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HK.png new file mode 100644 index 0000000..2709393 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HM.png new file mode 100644 index 0000000..dab1e3c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HN.png new file mode 100644 index 0000000..586808f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HR.png new file mode 100644 index 0000000..42b504c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HT.png new file mode 100644 index 0000000..add0370 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HU.png new file mode 100644 index 0000000..1b750b3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HVBF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HVBF.png new file mode 100644 index 0000000..107a8a0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/HVBF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IC.png new file mode 100644 index 0000000..44f2d1e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ID.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ID.png new file mode 100644 index 0000000..3e6f75b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ID.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IE.png new file mode 100644 index 0000000..7cefb2a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IL.png new file mode 100644 index 0000000..aaa86f5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IM.png new file mode 100644 index 0000000..d6f5a9c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IN-JK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IN-JK.png new file mode 100644 index 0000000..24b8327 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IN-JK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IN.png new file mode 100644 index 0000000..3bb678c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IO.png new file mode 100644 index 0000000..8c318c9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IQ.png new file mode 100644 index 0000000..1aa2c60 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IR.png new file mode 100644 index 0000000..048bc8e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IS.png new file mode 100644 index 0000000..e1d0b4d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IT.png new file mode 100644 index 0000000..d627455 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/IT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/JE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/JE.png new file mode 100644 index 0000000..4f66569 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/JE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/JM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/JM.png new file mode 100644 index 0000000..59c8967 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/JM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/JO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/JO.png new file mode 100644 index 0000000..b173a1a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/JO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/JP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/JP.png new file mode 100644 index 0000000..065d1b7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/JP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/JTUM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/JTUM.png new file mode 100644 index 0000000..98e7117 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/JTUM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KAKH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KAKH.png new file mode 100644 index 0000000..7a6aa6a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KAKH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KE.png new file mode 100644 index 0000000..3867116 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KG.png new file mode 100644 index 0000000..021944c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KH.png new file mode 100644 index 0000000..e3dc5c3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KHKA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KHKA.png new file mode 100644 index 0000000..af62e53 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KHKA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KI.png new file mode 100644 index 0000000..7294d82 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KM-A.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KM-A.png new file mode 100644 index 0000000..6c0b07f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KM-A.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KM-M.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KM-M.png new file mode 100644 index 0000000..e3941c3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KM-M.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KM.png new file mode 100644 index 0000000..eba20bf Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KN.png new file mode 100644 index 0000000..f174b01 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KOJP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KOJP.png new file mode 100644 index 0000000..2a7dd88 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KOJP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KP.png new file mode 100644 index 0000000..b724ccf Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KR.png new file mode 100644 index 0000000..aa6affd Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KW.png new file mode 100644 index 0000000..e4d6d29 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KY.png new file mode 100644 index 0000000..52af6e0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KZ.png new file mode 100644 index 0000000..fef3fb9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/KZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LA.png new file mode 100644 index 0000000..1a52d08 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LB.png new file mode 100644 index 0000000..3129d9b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LC.png new file mode 100644 index 0000000..384fe51 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LI.png new file mode 100644 index 0000000..8627560 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LK.png new file mode 100644 index 0000000..6b0173f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LKLK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LKLK.png new file mode 100644 index 0000000..6b0173f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LKLK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LR.png new file mode 100644 index 0000000..37f116b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LS.png new file mode 100644 index 0000000..7f35e78 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LT.png new file mode 100644 index 0000000..8e5fd7d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LU.png new file mode 100644 index 0000000..54c57ff Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LV.png new file mode 100644 index 0000000..4cab81e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LY.png new file mode 100644 index 0000000..4cde74a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/LY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MA.png new file mode 100644 index 0000000..c1d2cde Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MC.png new file mode 100644 index 0000000..3e6f75b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MD-SN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MD-SN.png new file mode 100644 index 0000000..0a9bc9c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MD-SN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MD.png new file mode 100644 index 0000000..b68e431 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ME.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ME.png new file mode 100644 index 0000000..25fb5bd Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ME.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MF.png new file mode 100644 index 0000000..98df45a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MG.png new file mode 100644 index 0000000..6576026 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MH.png new file mode 100644 index 0000000..ebdb5a1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MIUM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MIUM.png new file mode 100644 index 0000000..17b7c92 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MIUM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MK.png new file mode 100644 index 0000000..227694f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ML-AZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ML-AZ.png new file mode 100644 index 0000000..4aa0813 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ML-AZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ML.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ML.png new file mode 100644 index 0000000..f6609fe Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ML.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MM.png new file mode 100644 index 0000000..dbec08a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MN.png new file mode 100644 index 0000000..e33794d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MO.png new file mode 100644 index 0000000..960d783 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MP.png new file mode 100644 index 0000000..b51d02d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MQ.png new file mode 100644 index 0000000..e65a3f1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MR.png new file mode 100644 index 0000000..ecb422e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MS.png new file mode 100644 index 0000000..034800b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MT.png new file mode 100644 index 0000000..d550d27 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MU.png new file mode 100644 index 0000000..6c0c8f3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MV.png new file mode 100644 index 0000000..99200b2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MW.png new file mode 100644 index 0000000..69cfafe Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MX.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MX.png new file mode 100644 index 0000000..92e0b61 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MX.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MY.png new file mode 100644 index 0000000..34a9867 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MZ.png new file mode 100644 index 0000000..5361f0b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/MZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NA.png new file mode 100644 index 0000000..c60e652 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NC.png new file mode 100644 index 0000000..d9a46ff Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NE.png new file mode 100644 index 0000000..6ab99be Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NF.png new file mode 100644 index 0000000..9338944 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NG-BI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NG-BI.png new file mode 100644 index 0000000..ad014ef Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NG-BI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NG.png new file mode 100644 index 0000000..d132963 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NHVU-TF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NHVU-TF.png new file mode 100644 index 0000000..cde6da2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NHVU-TF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NHVU-TN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NHVU-TN.png new file mode 100644 index 0000000..b477b37 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NHVU-TN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NHVU-VE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NHVU-VE.png new file mode 100644 index 0000000..3d4a0cf Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NHVU-VE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NHVU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NHVU.png new file mode 100644 index 0000000..91ca564 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NHVU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NI.png new file mode 100644 index 0000000..fa4e161 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NL.png new file mode 100644 index 0000000..64fba94 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NO-PI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NO-PI.png new file mode 100644 index 0000000..88b9b5a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NO-PI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NO.png new file mode 100644 index 0000000..88b9b5a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NP.png new file mode 100644 index 0000000..4700a27 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NQAQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NQAQ.png new file mode 100644 index 0000000..88b9b5a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NQAQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NR.png new file mode 100644 index 0000000..03328a9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NTHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NTHH.png new file mode 100644 index 0000000..6f854e2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NTHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NU.png new file mode 100644 index 0000000..6ccf0b9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NZ-AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NZ-AQ.png new file mode 100644 index 0000000..fa92701 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NZ-AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NZ.png new file mode 100644 index 0000000..fa92701 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/NZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/OM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/OM.png new file mode 100644 index 0000000..6971bc9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/OM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PA.png new file mode 100644 index 0000000..df2a1d0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PCHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PCHH.png new file mode 100644 index 0000000..9d979f7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PCHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PE.png new file mode 100644 index 0000000..25c4e6e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PF.png new file mode 100644 index 0000000..f98eac1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PG-NSA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PG-NSA.png new file mode 100644 index 0000000..789d3ba Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PG-NSA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PG.png new file mode 100644 index 0000000..f88ad0a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PH.png new file mode 100644 index 0000000..f6e6721 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PK-JK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PK-JK.png new file mode 100644 index 0000000..eba77ca Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PK-JK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PK-NA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PK-NA.png new file mode 100644 index 0000000..78d169e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PK-NA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PK.png new file mode 100644 index 0000000..96482f0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PL.png new file mode 100644 index 0000000..fc539d9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PM.png new file mode 100644 index 0000000..6ecf501 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PN.png new file mode 100644 index 0000000..9e51fbd Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PR.png new file mode 100644 index 0000000..5e1d2e8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PS.png new file mode 100644 index 0000000..6c2f9bb Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PT.png new file mode 100644 index 0000000..9d1d01d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PUUM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PUUM.png new file mode 100644 index 0000000..c5cf517 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PUUM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PW.png new file mode 100644 index 0000000..e82586c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PY.png new file mode 100644 index 0000000..ac104fa Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PZPA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PZPA.png new file mode 100644 index 0000000..4140532 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/PZPA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/QA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/QA.png new file mode 100644 index 0000000..e1183e4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/QA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RE.png new file mode 100644 index 0000000..452f458 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RHZW-RH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RHZW-RH.png new file mode 100644 index 0000000..7c2ae17 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RHZW-RH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RHZW-ZR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RHZW-ZR.png new file mode 100644 index 0000000..877490f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RHZW-ZR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RHZW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RHZW.png new file mode 100644 index 0000000..30fe5d7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RHZW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RO.png new file mode 100644 index 0000000..7f35446 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RS.png new file mode 100644 index 0000000..c3ce05d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RU-CE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RU-CE.png new file mode 100644 index 0000000..21b5723 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RU-CE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RU.png new file mode 100644 index 0000000..ce1cdac Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RW.png new file mode 100644 index 0000000..ca9c458 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/RW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SA.png new file mode 100644 index 0000000..f53299c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SB.png new file mode 100644 index 0000000..5ebe737 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SC.png new file mode 100644 index 0000000..586f96b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SD.png new file mode 100644 index 0000000..8b428a1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SE.png new file mode 100644 index 0000000..ec8f3ff Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SG.png new file mode 100644 index 0000000..4a1cc8e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SH.png new file mode 100644 index 0000000..8e4260f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SI.png new file mode 100644 index 0000000..93599d8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SITH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SITH.png new file mode 100644 index 0000000..d37338e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SITH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SJ.png new file mode 100644 index 0000000..88b9b5a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SK.png new file mode 100644 index 0000000..6ce3d3e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SKIN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SKIN.png new file mode 100644 index 0000000..c977060 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SKIN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SL.png new file mode 100644 index 0000000..a9b46da Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SM.png new file mode 100644 index 0000000..bd989a1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SN.png new file mode 100644 index 0000000..b5e1ae7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SO-SO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SO-SO.png new file mode 100644 index 0000000..15809cd Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SO-SO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SO.png new file mode 100644 index 0000000..4115bd4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SR.png new file mode 100644 index 0000000..799599d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SS.png new file mode 100644 index 0000000..4c8ba5d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ST.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ST.png new file mode 100644 index 0000000..9da413c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ST.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SUHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SUHH.png new file mode 100644 index 0000000..e544322 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SUHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SV.png new file mode 100644 index 0000000..da1ac25 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SX.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SX.png new file mode 100644 index 0000000..2b7f96f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SX.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SY.png new file mode 100644 index 0000000..78a4bde Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SZ.png new file mode 100644 index 0000000..d86c3c9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/SZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TA.png new file mode 100644 index 0000000..5f74662 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TC.png new file mode 100644 index 0000000..4d9453c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TD.png new file mode 100644 index 0000000..9c61a05 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TF.png new file mode 100644 index 0000000..1cf52b3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TG.png new file mode 100644 index 0000000..5c59a96 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TH.png new file mode 100644 index 0000000..10b8c57 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TJ.png new file mode 100644 index 0000000..f8b816d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TK.png new file mode 100644 index 0000000..123dcb3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TL.png new file mode 100644 index 0000000..75dde93 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TM.png new file mode 100644 index 0000000..009619b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TN.png new file mode 100644 index 0000000..262e35a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TO.png new file mode 100644 index 0000000..d1d38b8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TPTL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TPTL.png new file mode 100644 index 0000000..75dde93 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TPTL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TR.png new file mode 100644 index 0000000..8f21dc3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TT.png new file mode 100644 index 0000000..d8e9018 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TV.png new file mode 100644 index 0000000..1124be5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TW.png new file mode 100644 index 0000000..6e47027 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TZ.png new file mode 100644 index 0000000..bc9283f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/TZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UA.png new file mode 100644 index 0000000..4d66349 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UAUA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UAUA.png new file mode 100644 index 0000000..fb36190 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UAUA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UG-RW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UG-RW.png new file mode 100644 index 0000000..f553a45 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UG-RW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UG.png new file mode 100644 index 0000000..19ef321 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UK.png new file mode 100644 index 0000000..3b0a7a0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UM.png new file mode 100644 index 0000000..c5cf517 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/US.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/US.png new file mode 100644 index 0000000..c5cf517 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/US.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UY.png new file mode 100644 index 0000000..c8c7c66 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UZ.png new file mode 100644 index 0000000..f6cec61 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/UZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VA.png new file mode 100644 index 0000000..316bfeb Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VC.png new file mode 100644 index 0000000..3f61a82 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VDVN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VDVN.png new file mode 100644 index 0000000..bf51fc7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VDVN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VE.png new file mode 100644 index 0000000..89d0d49 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VG.png new file mode 100644 index 0000000..ffd057e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VI.png new file mode 100644 index 0000000..ec5b743 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VN.png new file mode 100644 index 0000000..8993160 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VNVN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VNVN.png new file mode 100644 index 0000000..df1072e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VNVN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VU.png new file mode 100644 index 0000000..b14df92 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/VU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/WF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/WF.png new file mode 100644 index 0000000..6ae4688 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/WF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/WKUM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/WKUM.png new file mode 100644 index 0000000..f4219e6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/WKUM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/WS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/WS.png new file mode 100644 index 0000000..33996f2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/WS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/XK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/XK.png new file mode 100644 index 0000000..00c6cb6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/XK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/YDYE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/YDYE.png new file mode 100644 index 0000000..c84275c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/YDYE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/YE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/YE.png new file mode 100644 index 0000000..3cda834 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/YE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/YEYE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/YEYE.png new file mode 100644 index 0000000..5d49742 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/YEYE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/YT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/YT.png new file mode 100644 index 0000000..aa496d5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/YT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/YUCS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/YUCS.png new file mode 100644 index 0000000..f497592 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/YUCS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZA-BO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZA-BO.png new file mode 100644 index 0000000..10b7161 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZA-BO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZA-CI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZA-CI.png new file mode 100644 index 0000000..41906a4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZA-CI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZA-TR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZA-TR.png new file mode 100644 index 0000000..2b37ea8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZA-TR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZA-VE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZA-VE.png new file mode 100644 index 0000000..bd493d9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZA-VE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZA.png new file mode 100644 index 0000000..afa3b77 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZM.png new file mode 100644 index 0000000..e9e2e84 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZRCD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZRCD.png new file mode 100644 index 0000000..16e263d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZRCD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZW.png new file mode 100644 index 0000000..5c01a4a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/16/ZW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AC.png new file mode 100644 index 0000000..490fc03 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AD.png new file mode 100644 index 0000000..6dfb191 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-AJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-AJ.png new file mode 100644 index 0000000..87ab000 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-AJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-AZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-AZ.png new file mode 100644 index 0000000..c029672 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-AZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-DU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-DU.png new file mode 100644 index 0000000..87ab000 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-DU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-FU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-FU.png new file mode 100644 index 0000000..b4c09d7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-FU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-RK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-RK.png new file mode 100644 index 0000000..88a730e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-RK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-SH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-SH.png new file mode 100644 index 0000000..88a730e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-SH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-UQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-UQ.png new file mode 100644 index 0000000..b951185 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE-UQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE.png new file mode 100644 index 0000000..b4c09d7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AF.png new file mode 100644 index 0000000..e07ac0c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AG.png new file mode 100644 index 0000000..030f68f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AI.png new file mode 100644 index 0000000..ea37763 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AIDJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AIDJ.png new file mode 100644 index 0000000..85c9ed6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AIDJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AL.png new file mode 100644 index 0000000..4952c0d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AM.png new file mode 100644 index 0000000..8df3312 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ANHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ANHH.png new file mode 100644 index 0000000..283870d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ANHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AO-CAB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AO-CAB.png new file mode 100644 index 0000000..e9dc464 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AO-CAB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AO.png new file mode 100644 index 0000000..8af92b8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AQ.png new file mode 100644 index 0000000..007421b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AR-AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AR-AQ.png new file mode 100644 index 0000000..8c82056 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AR-AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AR.png new file mode 100644 index 0000000..5ba818f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AS.png new file mode 100644 index 0000000..a1f44c3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AT.png new file mode 100644 index 0000000..5f11415 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AU-AC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AU-AC.png new file mode 100644 index 0000000..309586c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AU-AC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AU-AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AU-AQ.png new file mode 100644 index 0000000..309586c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AU-AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AU-CS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AU-CS.png new file mode 100644 index 0000000..309586c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AU-CS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AU.png new file mode 100644 index 0000000..309586c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AW.png new file mode 100644 index 0000000..a61c6f0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AX.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AX.png new file mode 100644 index 0000000..a8f4b3a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AX.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AZ-NK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AZ-NK.png new file mode 100644 index 0000000..b850a85 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AZ-NK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AZ.png new file mode 100644 index 0000000..477520e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/AZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BA.png new file mode 100644 index 0000000..dd08612 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BB.png new file mode 100644 index 0000000..1289d0d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BD.png new file mode 100644 index 0000000..8eeb76d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BE.png new file mode 100644 index 0000000..16e87c4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BF.png new file mode 100644 index 0000000..d12a1cd Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BG.png new file mode 100644 index 0000000..1c752d6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BH.png new file mode 100644 index 0000000..972fe08 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BI.png new file mode 100644 index 0000000..b6fdbb7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BJ.png new file mode 100644 index 0000000..af028f7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BL.png new file mode 100644 index 0000000..30f0b8c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BM.png new file mode 100644 index 0000000..d097c06 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BN.png new file mode 100644 index 0000000..4ab3d4d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BO.png new file mode 100644 index 0000000..181a417 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BQ.png new file mode 100644 index 0000000..6808cdc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BQAQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BQAQ.png new file mode 100644 index 0000000..d5ae99b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BQAQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BR.png new file mode 100644 index 0000000..f4e7708 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BS.png new file mode 100644 index 0000000..bb35539 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BT.png new file mode 100644 index 0000000..e1e42d6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BUMM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BUMM.png new file mode 100644 index 0000000..cefc0b0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BUMM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BV.png new file mode 100644 index 0000000..702cefa Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BW.png new file mode 100644 index 0000000..1564dee Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BY.png new file mode 100644 index 0000000..fda6242 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BYAA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BYAA.png new file mode 100644 index 0000000..632a091 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BYAA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BZ.png new file mode 100644 index 0000000..0381068 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/BZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CA.png new file mode 100644 index 0000000..0a8728c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CC.png new file mode 100644 index 0000000..aa689ae Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CD.png new file mode 100644 index 0000000..8c1b266 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CF.png new file mode 100644 index 0000000..cac4f76 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CG.png new file mode 100644 index 0000000..c0bcf9c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CH.png new file mode 100644 index 0000000..28e8de1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CI.png new file mode 100644 index 0000000..578872c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CK.png new file mode 100644 index 0000000..9db948b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CL-AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CL-AQ.png new file mode 100644 index 0000000..dc99dda Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CL-AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CL.png new file mode 100644 index 0000000..731cc50 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CM.png new file mode 100644 index 0000000..57386c4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CN.png new file mode 100644 index 0000000..88690d3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CO.png new file mode 100644 index 0000000..6f3e70a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CP.png new file mode 100644 index 0000000..85c9ed6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CR.png new file mode 100644 index 0000000..a9afb94 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CSHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CSHH.png new file mode 100644 index 0000000..3031353 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CSHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CSXX.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CSXX.png new file mode 100644 index 0000000..857a9f8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CSXX.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CTKI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CTKI.png new file mode 100644 index 0000000..05a59a8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CTKI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CU.png new file mode 100644 index 0000000..2dceece Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CV.png new file mode 100644 index 0000000..39cc3a5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CW.png new file mode 100644 index 0000000..94e37af Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CX.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CX.png new file mode 100644 index 0000000..b679abc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CX.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CY-NC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CY-NC.png new file mode 100644 index 0000000..72fd3cb Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CY-NC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CY.png new file mode 100644 index 0000000..f23ed6d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CZ.png new file mode 100644 index 0000000..3031353 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/CZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DDDE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DDDE.png new file mode 100644 index 0000000..44ce886 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DDDE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DE.png new file mode 100644 index 0000000..0fe6aec Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DEDE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DEDE.png new file mode 100644 index 0000000..0fe6aec Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DEDE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DG.png new file mode 100644 index 0000000..9f6dafc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DJ.png new file mode 100644 index 0000000..5ae1a43 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DK.png new file mode 100644 index 0000000..16c6d6c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DM.png new file mode 100644 index 0000000..434b52d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DO.png new file mode 100644 index 0000000..61f33f5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DYBJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DYBJ.png new file mode 100644 index 0000000..af028f7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DYBJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DZ.png new file mode 100644 index 0000000..736c6b3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/DZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EA.png new file mode 100644 index 0000000..0d5e049 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EC.png new file mode 100644 index 0000000..1c8e7dd Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EE.png new file mode 100644 index 0000000..0a70d83 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EG.png new file mode 100644 index 0000000..a8dc277 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EGEG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EGEG.png new file mode 100644 index 0000000..2d73fa3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EGEG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EH.png new file mode 100644 index 0000000..a77c2a0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ER.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ER.png new file mode 100644 index 0000000..9906c8d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ER.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ES.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ES.png new file mode 100644 index 0000000..1eeb535 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ES.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ET.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ET.png new file mode 100644 index 0000000..16f0dd2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ET.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EU.png new file mode 100644 index 0000000..a7da645 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/EU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FI.png new file mode 100644 index 0000000..f973982 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FJ.png new file mode 100644 index 0000000..811fd07 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FK.png new file mode 100644 index 0000000..836f2a2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FM.png new file mode 100644 index 0000000..c383019 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FO.png new file mode 100644 index 0000000..36ded75 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FQHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FQHH.png new file mode 100644 index 0000000..b35a7ef Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FQHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FR-AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FR-AQ.png new file mode 100644 index 0000000..b35a7ef Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FR-AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FR.png new file mode 100644 index 0000000..85c9ed6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FXFR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FXFR.png new file mode 100644 index 0000000..85c9ed6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/FXFR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GA.png new file mode 100644 index 0000000..0e01296 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-AD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-AD.png new file mode 100644 index 0000000..d7cc791 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-AD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-ENG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-ENG.png new file mode 100644 index 0000000..a6a8d40 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-ENG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-NIR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-NIR.png new file mode 100644 index 0000000..4616904 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-NIR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-SCT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-SCT.png new file mode 100644 index 0000000..4230c63 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-SCT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-SL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-SL.png new file mode 100644 index 0000000..dd10415 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-SL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-WLS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-WLS.png new file mode 100644 index 0000000..5f02937 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB-WLS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB.png new file mode 100644 index 0000000..d7cc791 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GBAE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GBAE.png new file mode 100644 index 0000000..4fc2734 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GBAE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GBBZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GBBZ.png new file mode 100644 index 0000000..4931c6e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GBBZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GBKN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GBKN.png new file mode 100644 index 0000000..37b041f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GBKN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GD.png new file mode 100644 index 0000000..b3f9933 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GE-AB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GE-AB.png new file mode 100644 index 0000000..f611696 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GE-AB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GE-SK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GE-SK.png new file mode 100644 index 0000000..4ecbfc8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GE-SK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GE.png new file mode 100644 index 0000000..45ae64f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GEHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GEHH.png new file mode 100644 index 0000000..05a59a8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GEHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GEKI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GEKI.png new file mode 100644 index 0000000..05a59a8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GEKI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GETV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GETV.png new file mode 100644 index 0000000..05a59a8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GETV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GF.png new file mode 100644 index 0000000..e514d64 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GG-AL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GG-AL.png new file mode 100644 index 0000000..4fb2b6b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GG-AL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GG-HE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GG-HE.png new file mode 100644 index 0000000..b86a539 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GG-HE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GG-SA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GG-SA.png new file mode 100644 index 0000000..7d52fb9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GG-SA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GG.png new file mode 100644 index 0000000..e474a31 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GH.png new file mode 100644 index 0000000..0d30070 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GI.png new file mode 100644 index 0000000..33d366c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GL.png new file mode 100644 index 0000000..8e86869 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GM.png new file mode 100644 index 0000000..10ad16d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GN.png new file mode 100644 index 0000000..8de0316 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GP.png new file mode 100644 index 0000000..7ee5955 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GQ.png new file mode 100644 index 0000000..8980725 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GR.png new file mode 100644 index 0000000..440d65f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GS.png new file mode 100644 index 0000000..d2efd58 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GT.png new file mode 100644 index 0000000..9e867cf Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GU.png new file mode 100644 index 0000000..1c3f153 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GW.png new file mode 100644 index 0000000..42a8593 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GY.png new file mode 100644 index 0000000..60ff825 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/GY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HK.png new file mode 100644 index 0000000..484366c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HM.png new file mode 100644 index 0000000..309586c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HN.png new file mode 100644 index 0000000..f0ac805 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HR.png new file mode 100644 index 0000000..14b4e57 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HT.png new file mode 100644 index 0000000..3e5596f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HU.png new file mode 100644 index 0000000..d4cce04 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HVBF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HVBF.png new file mode 100644 index 0000000..8c03e3d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/HVBF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IC.png new file mode 100644 index 0000000..16f0f67 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ID.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ID.png new file mode 100644 index 0000000..7037040 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ID.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IE.png new file mode 100644 index 0000000..0cccece Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IL.png new file mode 100644 index 0000000..484f065 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IM.png new file mode 100644 index 0000000..9f3d9f1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IN-JK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IN-JK.png new file mode 100644 index 0000000..3e64eba Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IN-JK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IN.png new file mode 100644 index 0000000..5fe6fe9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IO.png new file mode 100644 index 0000000..9f6dafc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IQ.png new file mode 100644 index 0000000..703d1d7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IR.png new file mode 100644 index 0000000..7477e6c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IS.png new file mode 100644 index 0000000..08687cd Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IT.png new file mode 100644 index 0000000..8948ef2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/IT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/JE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/JE.png new file mode 100644 index 0000000..9a7379f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/JE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/JM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/JM.png new file mode 100644 index 0000000..e94e815 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/JM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/JO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/JO.png new file mode 100644 index 0000000..a3fa379 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/JO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/JP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/JP.png new file mode 100644 index 0000000..ae38694 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/JP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/JTUM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/JTUM.png new file mode 100644 index 0000000..3abace5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/JTUM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KAKH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KAKH.png new file mode 100644 index 0000000..2b42000 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KAKH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KE.png new file mode 100644 index 0000000..efb1ae6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KG.png new file mode 100644 index 0000000..c37d595 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KH.png new file mode 100644 index 0000000..7aae77b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KHKA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KHKA.png new file mode 100644 index 0000000..9d601f7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KHKA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KI.png new file mode 100644 index 0000000..46151f0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KM-A.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KM-A.png new file mode 100644 index 0000000..0d8fa42 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KM-A.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KM-M.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KM-M.png new file mode 100644 index 0000000..83bc575 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KM-M.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KM.png new file mode 100644 index 0000000..d7a7178 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KN.png new file mode 100644 index 0000000..abea14b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KOJP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KOJP.png new file mode 100644 index 0000000..4251db5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KOJP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KP.png new file mode 100644 index 0000000..97ff2d5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KR.png new file mode 100644 index 0000000..69e74f7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KW.png new file mode 100644 index 0000000..ac2b749 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KY.png new file mode 100644 index 0000000..512b2c5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KZ.png new file mode 100644 index 0000000..2d04766 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/KZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LA.png new file mode 100644 index 0000000..e916e48 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LB.png new file mode 100644 index 0000000..7ab31a0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LC.png new file mode 100644 index 0000000..2aa90b8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LI.png new file mode 100644 index 0000000..ed5e788 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LK.png new file mode 100644 index 0000000..94173a3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LKLK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LKLK.png new file mode 100644 index 0000000..94173a3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LKLK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LR.png new file mode 100644 index 0000000..697b0d7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LS.png new file mode 100644 index 0000000..f748562 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LT.png new file mode 100644 index 0000000..40c1447 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LU.png new file mode 100644 index 0000000..4586a59 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LV.png new file mode 100644 index 0000000..c4480e6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LY.png new file mode 100644 index 0000000..d485bfb Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/LY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MA.png new file mode 100644 index 0000000..137831c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MC.png new file mode 100644 index 0000000..7037040 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MD-SN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MD-SN.png new file mode 100644 index 0000000..78d5508 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MD-SN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MD.png new file mode 100644 index 0000000..37e6d30 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ME.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ME.png new file mode 100644 index 0000000..a945e1c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ME.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MF.png new file mode 100644 index 0000000..7453c14 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MG.png new file mode 100644 index 0000000..7e43ad3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MH.png new file mode 100644 index 0000000..268d1b5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MIUM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MIUM.png new file mode 100644 index 0000000..fc83e78 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MIUM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MK.png new file mode 100644 index 0000000..c414b2a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ML-AZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ML-AZ.png new file mode 100644 index 0000000..8816d21 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ML-AZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ML.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ML.png new file mode 100644 index 0000000..c0fd772 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ML.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MM.png new file mode 100644 index 0000000..34f268a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MN.png new file mode 100644 index 0000000..96ad8c5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MO.png new file mode 100644 index 0000000..6f5da86 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MP.png new file mode 100644 index 0000000..dd59a1f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MQ.png new file mode 100644 index 0000000..b189e95 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MR.png new file mode 100644 index 0000000..5a9fae8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MS.png new file mode 100644 index 0000000..ef17947 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MT.png new file mode 100644 index 0000000..c69ca42 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MU.png new file mode 100644 index 0000000..f8b13a7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MV.png new file mode 100644 index 0000000..b8ea7b2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MW.png new file mode 100644 index 0000000..ddd10fb Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MX.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MX.png new file mode 100644 index 0000000..a34b86a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MX.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MY.png new file mode 100644 index 0000000..8eff2fe Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MZ.png new file mode 100644 index 0000000..1a47501 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/MZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NA.png new file mode 100644 index 0000000..0ad0344 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NC.png new file mode 100644 index 0000000..4d179cc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NE.png new file mode 100644 index 0000000..428a447 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NF.png new file mode 100644 index 0000000..4f5bae7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NG-BI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NG-BI.png new file mode 100644 index 0000000..a3c0bad Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NG-BI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NG.png new file mode 100644 index 0000000..7f4ead0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NHVU-TF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NHVU-TF.png new file mode 100644 index 0000000..8183514 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NHVU-TF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NHVU-TN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NHVU-TN.png new file mode 100644 index 0000000..0405622 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NHVU-TN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NHVU-VE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NHVU-VE.png new file mode 100644 index 0000000..af2f011 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NHVU-VE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NHVU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NHVU.png new file mode 100644 index 0000000..25850b6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NHVU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NI.png new file mode 100644 index 0000000..612379f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NL.png new file mode 100644 index 0000000..47b49ec Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NO-PI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NO-PI.png new file mode 100644 index 0000000..702cefa Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NO-PI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NO.png new file mode 100644 index 0000000..702cefa Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NP.png new file mode 100644 index 0000000..e65d579 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NQAQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NQAQ.png new file mode 100644 index 0000000..702cefa Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NQAQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NR.png new file mode 100644 index 0000000..d99a748 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NTHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NTHH.png new file mode 100644 index 0000000..fe4052e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NTHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NU.png new file mode 100644 index 0000000..22e1fd7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NZ-AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NZ-AQ.png new file mode 100644 index 0000000..1c2326a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NZ-AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NZ.png new file mode 100644 index 0000000..1c2326a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/NZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/OM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/OM.png new file mode 100644 index 0000000..f8ca571 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/OM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PA.png new file mode 100644 index 0000000..7d0bc63 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PCHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PCHH.png new file mode 100644 index 0000000..23358a7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PCHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PE.png new file mode 100644 index 0000000..0754a1b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PF.png new file mode 100644 index 0000000..3b03d71 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PG-NSA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PG-NSA.png new file mode 100644 index 0000000..d7e2709 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PG-NSA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PG.png new file mode 100644 index 0000000..fe3a5ff Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PH.png new file mode 100644 index 0000000..b2c5de0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PK-JK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PK-JK.png new file mode 100644 index 0000000..a23abf1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PK-JK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PK-NA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PK-NA.png new file mode 100644 index 0000000..9a0ba2d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PK-NA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PK.png new file mode 100644 index 0000000..a27a159 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PL.png new file mode 100644 index 0000000..ac548cf Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PM.png new file mode 100644 index 0000000..e1d287a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PN.png new file mode 100644 index 0000000..4436bb7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PR.png new file mode 100644 index 0000000..3e81f03 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PS.png new file mode 100644 index 0000000..6c061f1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PT.png new file mode 100644 index 0000000..d41ec8f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PUUM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PUUM.png new file mode 100644 index 0000000..53568eb Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PUUM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PW.png new file mode 100644 index 0000000..953f85f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PY.png new file mode 100644 index 0000000..274804b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PZPA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PZPA.png new file mode 100644 index 0000000..f78c5b4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/PZPA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/QA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/QA.png new file mode 100644 index 0000000..ae0a3d5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/QA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RE.png new file mode 100644 index 0000000..782f6ed Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RHZW-RH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RHZW-RH.png new file mode 100644 index 0000000..7e89ff0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RHZW-RH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RHZW-ZR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RHZW-ZR.png new file mode 100644 index 0000000..744b621 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RHZW-ZR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RHZW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RHZW.png new file mode 100644 index 0000000..e65944b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RHZW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RO.png new file mode 100644 index 0000000..19ef860 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RS.png new file mode 100644 index 0000000..9170f69 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RU-CE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RU-CE.png new file mode 100644 index 0000000..2c72d05 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RU-CE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RU.png new file mode 100644 index 0000000..3a12074 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RW.png new file mode 100644 index 0000000..ed00906 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/RW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SA.png new file mode 100644 index 0000000..892dbc0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SB.png new file mode 100644 index 0000000..0871bad Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SC.png new file mode 100644 index 0000000..52b790b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SD.png new file mode 100644 index 0000000..1412716 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SE.png new file mode 100644 index 0000000..34bf6b2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SG.png new file mode 100644 index 0000000..37402f1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SH.png new file mode 100644 index 0000000..e67b666 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SI.png new file mode 100644 index 0000000..44cef2f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SITH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SITH.png new file mode 100644 index 0000000..fa3785f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SITH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SJ.png new file mode 100644 index 0000000..702cefa Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SK.png new file mode 100644 index 0000000..7e28060 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SKIN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SKIN.png new file mode 100644 index 0000000..3641823 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SKIN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SL.png new file mode 100644 index 0000000..920e8c6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SM.png new file mode 100644 index 0000000..6921211 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SN.png new file mode 100644 index 0000000..7d63435 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SO-SO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SO-SO.png new file mode 100644 index 0000000..49def04 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SO-SO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SO.png new file mode 100644 index 0000000..0a5cc3e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SR.png new file mode 100644 index 0000000..320ccc8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SS.png new file mode 100644 index 0000000..2d0be92 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ST.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ST.png new file mode 100644 index 0000000..cff437d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ST.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SUHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SUHH.png new file mode 100644 index 0000000..afef1ad Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SUHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SV.png new file mode 100644 index 0000000..0dcaf6a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SX.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SX.png new file mode 100644 index 0000000..d9f56e0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SX.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SY.png new file mode 100644 index 0000000..2d73fa3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SZ.png new file mode 100644 index 0000000..8abb1f8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/SZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TA.png new file mode 100644 index 0000000..22c622f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TC.png new file mode 100644 index 0000000..4377d98 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TD.png new file mode 100644 index 0000000..d8dc585 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TF.png new file mode 100644 index 0000000..b35a7ef Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TG.png new file mode 100644 index 0000000..fd691c9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TH.png new file mode 100644 index 0000000..e5db9ea Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TJ.png new file mode 100644 index 0000000..24e2f43 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TK.png new file mode 100644 index 0000000..671fb8a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TL.png new file mode 100644 index 0000000..31474b1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TM.png new file mode 100644 index 0000000..7e32ec4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TN.png new file mode 100644 index 0000000..7dc0dea Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TO.png new file mode 100644 index 0000000..b5e7a3f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TPTL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TPTL.png new file mode 100644 index 0000000..31474b1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TPTL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TR.png new file mode 100644 index 0000000..942368c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TT.png new file mode 100644 index 0000000..296960c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TV.png new file mode 100644 index 0000000..b05f8dd Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TW.png new file mode 100644 index 0000000..872be39 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TZ.png new file mode 100644 index 0000000..12deda9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/TZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UA.png new file mode 100644 index 0000000..87e0928 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UAUA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UAUA.png new file mode 100644 index 0000000..cfa57d2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UAUA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UG-RW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UG-RW.png new file mode 100644 index 0000000..6ae552f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UG-RW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UG.png new file mode 100644 index 0000000..24f7a41 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UK.png new file mode 100644 index 0000000..d7cc791 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UM.png new file mode 100644 index 0000000..53568eb Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/US.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/US.png new file mode 100644 index 0000000..53568eb Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/US.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UY.png new file mode 100644 index 0000000..24c4902 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UZ.png new file mode 100644 index 0000000..dfcbdfe Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/UZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VA.png new file mode 100644 index 0000000..6410961 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VC.png new file mode 100644 index 0000000..5704f33 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VDVN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VDVN.png new file mode 100644 index 0000000..fec715e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VDVN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VE.png new file mode 100644 index 0000000..e0f974f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VG.png new file mode 100644 index 0000000..ad82be7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VI.png new file mode 100644 index 0000000..fda2bf0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VN.png new file mode 100644 index 0000000..8b2b8bc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VNVN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VNVN.png new file mode 100644 index 0000000..d4b84a0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VNVN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VU.png new file mode 100644 index 0000000..9956847 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/VU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/WF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/WF.png new file mode 100644 index 0000000..0c996c9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/WF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/WKUM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/WKUM.png new file mode 100644 index 0000000..45b867a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/WKUM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/WS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/WS.png new file mode 100644 index 0000000..0a7ca93 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/WS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/XK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/XK.png new file mode 100644 index 0000000..d5aa44a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/XK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/YDYE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/YDYE.png new file mode 100644 index 0000000..ffc5751 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/YDYE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/YE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/YE.png new file mode 100644 index 0000000..df0d865 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/YE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/YEYE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/YEYE.png new file mode 100644 index 0000000..914e08a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/YEYE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/YT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/YT.png new file mode 100644 index 0000000..e0ad2a1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/YT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/YUCS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/YUCS.png new file mode 100644 index 0000000..f3fb49f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/YUCS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZA-BO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZA-BO.png new file mode 100644 index 0000000..b542c47 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZA-BO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZA-CI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZA-CI.png new file mode 100644 index 0000000..b510a53 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZA-CI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZA-TR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZA-TR.png new file mode 100644 index 0000000..dccd4ae Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZA-TR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZA-VE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZA-VE.png new file mode 100644 index 0000000..d297a06 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZA-VE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZA.png new file mode 100644 index 0000000..3ef2d72 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZM.png new file mode 100644 index 0000000..bd89ac4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZRCD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZRCD.png new file mode 100644 index 0000000..457b1fe Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZRCD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZW.png new file mode 100644 index 0000000..c34f8f0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/256/ZW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AC.png new file mode 100644 index 0000000..f588ddd Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AD.png new file mode 100644 index 0000000..06623a6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-AJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-AJ.png new file mode 100644 index 0000000..62bca4d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-AJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-AZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-AZ.png new file mode 100644 index 0000000..cf63494 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-AZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-DU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-DU.png new file mode 100644 index 0000000..62bca4d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-DU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-FU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-FU.png new file mode 100644 index 0000000..6b2345b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-FU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-RK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-RK.png new file mode 100644 index 0000000..c36e70c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-RK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-SH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-SH.png new file mode 100644 index 0000000..c36e70c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-SH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-UQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-UQ.png new file mode 100644 index 0000000..6f1c6c9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE-UQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE.png new file mode 100644 index 0000000..6b2345b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AF.png new file mode 100644 index 0000000..791f72f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AG.png new file mode 100644 index 0000000..1accfd1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AI.png new file mode 100644 index 0000000..f4c929d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AIDJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AIDJ.png new file mode 100644 index 0000000..9ca1346 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AIDJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AL.png new file mode 100644 index 0000000..b406ed0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AM.png new file mode 100644 index 0000000..f5d8a9d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ANHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ANHH.png new file mode 100644 index 0000000..2fc1037 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ANHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AO-CAB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AO-CAB.png new file mode 100644 index 0000000..b13554f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AO-CAB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AO.png new file mode 100644 index 0000000..3351437 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AQ.png new file mode 100644 index 0000000..de83d79 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AR-AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AR-AQ.png new file mode 100644 index 0000000..ab60b85 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AR-AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AR.png new file mode 100644 index 0000000..3b2678c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AS.png new file mode 100644 index 0000000..66e7571 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AT.png new file mode 100644 index 0000000..1550838 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AU-AC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AU-AC.png new file mode 100644 index 0000000..98ef1f5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AU-AC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AU-AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AU-AQ.png new file mode 100644 index 0000000..98ef1f5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AU-AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AU-CS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AU-CS.png new file mode 100644 index 0000000..98ef1f5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AU-CS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AU.png new file mode 100644 index 0000000..98ef1f5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AW.png new file mode 100644 index 0000000..0d34ccf Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AX.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AX.png new file mode 100644 index 0000000..22617f4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AX.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AZ-NK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AZ-NK.png new file mode 100644 index 0000000..eedc051 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AZ-NK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AZ.png new file mode 100644 index 0000000..2735102 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/AZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BA.png new file mode 100644 index 0000000..d22d573 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BB.png new file mode 100644 index 0000000..a7eb029 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BD.png new file mode 100644 index 0000000..435e1b2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BE.png new file mode 100644 index 0000000..215ebb4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BF.png new file mode 100644 index 0000000..5597cc2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BG.png new file mode 100644 index 0000000..b2885d2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BH.png new file mode 100644 index 0000000..657353c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BI.png new file mode 100644 index 0000000..4a81f2b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BJ.png new file mode 100644 index 0000000..db5b38c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BL.png new file mode 100644 index 0000000..1e6363e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BM.png new file mode 100644 index 0000000..04dad37 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BN.png new file mode 100644 index 0000000..e710aaf Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BO.png new file mode 100644 index 0000000..265af26 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BQ.png new file mode 100644 index 0000000..7c94b53 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BQAQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BQAQ.png new file mode 100644 index 0000000..3fc47dd Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BQAQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BR.png new file mode 100644 index 0000000..e9fca01 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BS.png new file mode 100644 index 0000000..1042e51 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BT.png new file mode 100644 index 0000000..b3592c4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BUMM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BUMM.png new file mode 100644 index 0000000..5ace82f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BUMM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BV.png new file mode 100644 index 0000000..0698787 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BW.png new file mode 100644 index 0000000..20a6571 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BY.png new file mode 100644 index 0000000..6f6db72 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BYAA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BYAA.png new file mode 100644 index 0000000..d881813 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BYAA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BZ.png new file mode 100644 index 0000000..455b6c2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/BZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CA.png new file mode 100644 index 0000000..590c377 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CC.png new file mode 100644 index 0000000..5ab1f61 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CD.png new file mode 100644 index 0000000..e65d6e8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CF.png new file mode 100644 index 0000000..594b808 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CG.png new file mode 100644 index 0000000..8fd8057 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CH.png new file mode 100644 index 0000000..3722af8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CI.png new file mode 100644 index 0000000..5376ce2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CK.png new file mode 100644 index 0000000..4af8efc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CL-AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CL-AQ.png new file mode 100644 index 0000000..7808dee Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CL-AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CL.png new file mode 100644 index 0000000..63856fe Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CM.png new file mode 100644 index 0000000..62c2091 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CN.png new file mode 100644 index 0000000..0ce3aed Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CO.png new file mode 100644 index 0000000..6f3b9cc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CP.png new file mode 100644 index 0000000..9ca1346 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CR.png new file mode 100644 index 0000000..5736930 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CSHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CSHH.png new file mode 100644 index 0000000..1b31367 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CSHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CSXX.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CSXX.png new file mode 100644 index 0000000..c50ca28 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CSXX.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CTKI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CTKI.png new file mode 100644 index 0000000..1689210 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CTKI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CU.png new file mode 100644 index 0000000..3bed8c0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CV.png new file mode 100644 index 0000000..ef9276b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CW.png new file mode 100644 index 0000000..5b74d36 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CX.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CX.png new file mode 100644 index 0000000..19f082e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CX.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CY-NC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CY-NC.png new file mode 100644 index 0000000..2847e7f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CY-NC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CY.png new file mode 100644 index 0000000..6b0aac6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CZ.png new file mode 100644 index 0000000..1b31367 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/CZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DDDE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DDDE.png new file mode 100644 index 0000000..61b0ecc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DDDE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DE.png new file mode 100644 index 0000000..1cb323d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DEDE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DEDE.png new file mode 100644 index 0000000..1cb323d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DEDE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DG.png new file mode 100644 index 0000000..61437b6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DJ.png new file mode 100644 index 0000000..a857c74 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DK.png new file mode 100644 index 0000000..4c02b1f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DM.png new file mode 100644 index 0000000..4481a23 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DO.png new file mode 100644 index 0000000..ab65760 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DYBJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DYBJ.png new file mode 100644 index 0000000..db5b38c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DYBJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DZ.png new file mode 100644 index 0000000..abf8071 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/DZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EA.png new file mode 100644 index 0000000..7ceb8ca Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EC.png new file mode 100644 index 0000000..e8be86d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EE.png new file mode 100644 index 0000000..6d3b078 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EG.png new file mode 100644 index 0000000..6c0f3cd Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EGEG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EGEG.png new file mode 100644 index 0000000..26c4bf2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EGEG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EH.png new file mode 100644 index 0000000..99341f9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ER.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ER.png new file mode 100644 index 0000000..2feaeab Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ER.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ES.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ES.png new file mode 100644 index 0000000..e6dff0c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ES.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ET.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ET.png new file mode 100644 index 0000000..3b85718 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ET.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EU.png new file mode 100644 index 0000000..5faf822 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/EU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FI.png new file mode 100644 index 0000000..8dc76bd Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FJ.png new file mode 100644 index 0000000..4991e6b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FK.png new file mode 100644 index 0000000..a6c0a85 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FM.png new file mode 100644 index 0000000..c4c50d2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FO.png new file mode 100644 index 0000000..3e68bca Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FQHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FQHH.png new file mode 100644 index 0000000..606bad0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FQHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FR-AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FR-AQ.png new file mode 100644 index 0000000..606bad0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FR-AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FR.png new file mode 100644 index 0000000..9ca1346 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FXFR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FXFR.png new file mode 100644 index 0000000..9ca1346 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/FXFR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GA.png new file mode 100644 index 0000000..c4353da Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-AD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-AD.png new file mode 100644 index 0000000..1eeabe0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-AD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-ENG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-ENG.png new file mode 100644 index 0000000..bfd06c9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-ENG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-NIR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-NIR.png new file mode 100644 index 0000000..3f4ecc5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-NIR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-SCT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-SCT.png new file mode 100644 index 0000000..db9086e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-SCT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-SL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-SL.png new file mode 100644 index 0000000..cd4589b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-SL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-WLS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-WLS.png new file mode 100644 index 0000000..f742cca Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB-WLS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB.png new file mode 100644 index 0000000..1eeabe0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GBAE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GBAE.png new file mode 100644 index 0000000..9cb6cf3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GBAE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GBBZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GBBZ.png new file mode 100644 index 0000000..b705ffa Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GBBZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GBKN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GBKN.png new file mode 100644 index 0000000..65f97b2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GBKN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GD.png new file mode 100644 index 0000000..bd546aa Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GE-AB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GE-AB.png new file mode 100644 index 0000000..56f3e14 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GE-AB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GE-SK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GE-SK.png new file mode 100644 index 0000000..049fde1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GE-SK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GE.png new file mode 100644 index 0000000..3db7ffb Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GEHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GEHH.png new file mode 100644 index 0000000..1689210 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GEHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GEKI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GEKI.png new file mode 100644 index 0000000..1689210 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GEKI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GETV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GETV.png new file mode 100644 index 0000000..1689210 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GETV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GF.png new file mode 100644 index 0000000..1d868e3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GG-AL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GG-AL.png new file mode 100644 index 0000000..0971902 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GG-AL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GG-HE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GG-HE.png new file mode 100644 index 0000000..66e5a9e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GG-HE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GG-SA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GG-SA.png new file mode 100644 index 0000000..23d01da Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GG-SA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GG.png new file mode 100644 index 0000000..1614435 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GH.png new file mode 100644 index 0000000..1a44dfa Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GI.png new file mode 100644 index 0000000..c829b37 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GL.png new file mode 100644 index 0000000..2dbb702 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GM.png new file mode 100644 index 0000000..cd409ab Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GN.png new file mode 100644 index 0000000..c00e5f6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GP.png new file mode 100644 index 0000000..3f1a1d4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GQ.png new file mode 100644 index 0000000..abc41b1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GR.png new file mode 100644 index 0000000..1621ee8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GS.png new file mode 100644 index 0000000..de9c110 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GT.png new file mode 100644 index 0000000..5ea3f1a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GU.png new file mode 100644 index 0000000..689c417 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GW.png new file mode 100644 index 0000000..152d0b4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GY.png new file mode 100644 index 0000000..22e082a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/GY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HK.png new file mode 100644 index 0000000..9fc627c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HM.png new file mode 100644 index 0000000..98ef1f5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HN.png new file mode 100644 index 0000000..cb8998a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HR.png new file mode 100644 index 0000000..ac8fd7c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HT.png new file mode 100644 index 0000000..ba07d54 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HU.png new file mode 100644 index 0000000..de47fea Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HVBF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HVBF.png new file mode 100644 index 0000000..133ce5c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/HVBF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IC.png new file mode 100644 index 0000000..8c29fab Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ID.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ID.png new file mode 100644 index 0000000..97f67d7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ID.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IE.png new file mode 100644 index 0000000..2e47d28 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IL.png new file mode 100644 index 0000000..f01eb5c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IM.png new file mode 100644 index 0000000..7d95426 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IN-JK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IN-JK.png new file mode 100644 index 0000000..54dda83 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IN-JK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IN.png new file mode 100644 index 0000000..d77f45c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IO.png new file mode 100644 index 0000000..61437b6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IQ.png new file mode 100644 index 0000000..5500023 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IR.png new file mode 100644 index 0000000..f914bb1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IS.png new file mode 100644 index 0000000..cf98600 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IT.png new file mode 100644 index 0000000..4bb0782 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/IT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/JE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/JE.png new file mode 100644 index 0000000..0faeba0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/JE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/JM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/JM.png new file mode 100644 index 0000000..92347f2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/JM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/JO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/JO.png new file mode 100644 index 0000000..fae17bc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/JO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/JP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/JP.png new file mode 100644 index 0000000..2ccffb6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/JP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/JTUM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/JTUM.png new file mode 100644 index 0000000..75de3f8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/JTUM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KAKH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KAKH.png new file mode 100644 index 0000000..8292370 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KAKH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KE.png new file mode 100644 index 0000000..320431b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KG.png new file mode 100644 index 0000000..ce187c7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KH.png new file mode 100644 index 0000000..81e0264 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KHKA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KHKA.png new file mode 100644 index 0000000..11ace99 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KHKA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KI.png new file mode 100644 index 0000000..cd1a330 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KM-A.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KM-A.png new file mode 100644 index 0000000..c93183a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KM-A.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KM-M.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KM-M.png new file mode 100644 index 0000000..26a2778 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KM-M.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KM.png new file mode 100644 index 0000000..580cbfc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KN.png new file mode 100644 index 0000000..3caa342 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KOJP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KOJP.png new file mode 100644 index 0000000..e9146f4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KOJP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KP.png new file mode 100644 index 0000000..882d01a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KR.png new file mode 100644 index 0000000..5f99df3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KW.png new file mode 100644 index 0000000..3af15bf Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KY.png new file mode 100644 index 0000000..1242fec Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KZ.png new file mode 100644 index 0000000..d582df9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/KZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LA.png new file mode 100644 index 0000000..8ce81e4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LB.png new file mode 100644 index 0000000..2a70d27 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LC.png new file mode 100644 index 0000000..94a6069 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LI.png new file mode 100644 index 0000000..b91f145 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LK.png new file mode 100644 index 0000000..ba0057d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LKLK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LKLK.png new file mode 100644 index 0000000..ba0057d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LKLK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LR.png new file mode 100644 index 0000000..621e544 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LS.png new file mode 100644 index 0000000..84af173 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LT.png new file mode 100644 index 0000000..2b8d12b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LU.png new file mode 100644 index 0000000..7e26711 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LV.png new file mode 100644 index 0000000..7ea186c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LY.png new file mode 100644 index 0000000..e993073 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/LY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MA.png new file mode 100644 index 0000000..bc0bc28 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MC.png new file mode 100644 index 0000000..97f67d7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MD-SN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MD-SN.png new file mode 100644 index 0000000..e94d13b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MD-SN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MD.png new file mode 100644 index 0000000..d3d1482 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ME.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ME.png new file mode 100644 index 0000000..ab3c9a2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ME.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MF.png new file mode 100644 index 0000000..a4c1639 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MG.png new file mode 100644 index 0000000..ad53f0b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MH.png new file mode 100644 index 0000000..8981039 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MIUM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MIUM.png new file mode 100644 index 0000000..bafe393 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MIUM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MK.png new file mode 100644 index 0000000..d959caa Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ML-AZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ML-AZ.png new file mode 100644 index 0000000..c4cb928 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ML-AZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ML.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ML.png new file mode 100644 index 0000000..758997a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ML.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MM.png new file mode 100644 index 0000000..3ede4d0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MN.png new file mode 100644 index 0000000..dde27eb Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MO.png new file mode 100644 index 0000000..f89050b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MP.png new file mode 100644 index 0000000..ac8c1c2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MQ.png new file mode 100644 index 0000000..a2364eb Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MR.png new file mode 100644 index 0000000..14fcf98 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MS.png new file mode 100644 index 0000000..10228d7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MT.png new file mode 100644 index 0000000..6d5f0d6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MU.png new file mode 100644 index 0000000..025eecc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MV.png new file mode 100644 index 0000000..c6ebe15 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MW.png new file mode 100644 index 0000000..1e85c88 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MX.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MX.png new file mode 100644 index 0000000..ef7ac4f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MX.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MY.png new file mode 100644 index 0000000..a7c1104 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MZ.png new file mode 100644 index 0000000..019cee6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/MZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NA.png new file mode 100644 index 0000000..1d125c6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NC.png new file mode 100644 index 0000000..bf7e3dd Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NE.png new file mode 100644 index 0000000..ee09112 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NF.png new file mode 100644 index 0000000..72f2f20 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NG-BI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NG-BI.png new file mode 100644 index 0000000..bab75a8 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NG-BI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NG.png new file mode 100644 index 0000000..b7282cb Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NHVU-TF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NHVU-TF.png new file mode 100644 index 0000000..0655736 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NHVU-TF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NHVU-TN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NHVU-TN.png new file mode 100644 index 0000000..4069ddc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NHVU-TN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NHVU-VE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NHVU-VE.png new file mode 100644 index 0000000..a29396f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NHVU-VE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NHVU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NHVU.png new file mode 100644 index 0000000..15f0ad0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NHVU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NI.png new file mode 100644 index 0000000..8924628 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NL.png new file mode 100644 index 0000000..1c704c5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NO-PI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NO-PI.png new file mode 100644 index 0000000..0698787 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NO-PI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NO.png new file mode 100644 index 0000000..0698787 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NP.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NP.png new file mode 100644 index 0000000..22f7fed Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NP.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NQAQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NQAQ.png new file mode 100644 index 0000000..0698787 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NQAQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NR.png new file mode 100644 index 0000000..cecffa7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NTHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NTHH.png new file mode 100644 index 0000000..7617bcf Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NTHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NU.png new file mode 100644 index 0000000..c9ae9af Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NZ-AQ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NZ-AQ.png new file mode 100644 index 0000000..c25c4bd Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NZ-AQ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NZ.png new file mode 100644 index 0000000..c25c4bd Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/NZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/OM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/OM.png new file mode 100644 index 0000000..c88c788 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/OM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PA.png new file mode 100644 index 0000000..28be731 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PCHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PCHH.png new file mode 100644 index 0000000..f90e698 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PCHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PE.png new file mode 100644 index 0000000..8d285fb Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PF.png new file mode 100644 index 0000000..14d5fb9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PG-NSA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PG-NSA.png new file mode 100644 index 0000000..625de29 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PG-NSA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PG.png new file mode 100644 index 0000000..b8689d4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PH.png new file mode 100644 index 0000000..4332067 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PK-JK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PK-JK.png new file mode 100644 index 0000000..aa23182 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PK-JK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PK-NA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PK-NA.png new file mode 100644 index 0000000..cc4c475 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PK-NA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PK.png new file mode 100644 index 0000000..b23aead Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PL.png new file mode 100644 index 0000000..dcfb37f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PM.png new file mode 100644 index 0000000..94fc0c5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PN.png new file mode 100644 index 0000000..ac5cbd0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PR.png new file mode 100644 index 0000000..04c3263 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PS.png new file mode 100644 index 0000000..b04e8e7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PT.png new file mode 100644 index 0000000..aaff392 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PUUM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PUUM.png new file mode 100644 index 0000000..e78e68b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PUUM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PW.png new file mode 100644 index 0000000..0cc0996 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PY.png new file mode 100644 index 0000000..6fd2854 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PZPA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PZPA.png new file mode 100644 index 0000000..7369343 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/PZPA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/QA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/QA.png new file mode 100644 index 0000000..f37565a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/QA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RE.png new file mode 100644 index 0000000..7b7cdf6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RHZW-RH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RHZW-RH.png new file mode 100644 index 0000000..a9d1430 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RHZW-RH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RHZW-ZR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RHZW-ZR.png new file mode 100644 index 0000000..8133115 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RHZW-ZR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RHZW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RHZW.png new file mode 100644 index 0000000..e95bc13 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RHZW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RO.png new file mode 100644 index 0000000..27091c9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RS.png new file mode 100644 index 0000000..935d793 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RU-CE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RU-CE.png new file mode 100644 index 0000000..17e7169 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RU-CE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RU.png new file mode 100644 index 0000000..1734604 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RW.png new file mode 100644 index 0000000..3bbe5ea Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/RW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SA.png new file mode 100644 index 0000000..609eb37 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SB.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SB.png new file mode 100644 index 0000000..2ea93a1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SB.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SC.png new file mode 100644 index 0000000..90a5241 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SD.png new file mode 100644 index 0000000..ea44678 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SE.png new file mode 100644 index 0000000..8b5ad28 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SG.png new file mode 100644 index 0000000..3d6d9d6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SH.png new file mode 100644 index 0000000..33482a3 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SI.png new file mode 100644 index 0000000..b740d16 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SITH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SITH.png new file mode 100644 index 0000000..84ae0af Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SITH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SJ.png new file mode 100644 index 0000000..0698787 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SK.png new file mode 100644 index 0000000..82b55a7 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SKIN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SKIN.png new file mode 100644 index 0000000..cee4458 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SKIN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SL.png new file mode 100644 index 0000000..43a5175 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SM.png new file mode 100644 index 0000000..494a4f5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SN.png new file mode 100644 index 0000000..f0439b5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SO-SO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SO-SO.png new file mode 100644 index 0000000..a60bae5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SO-SO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SO.png new file mode 100644 index 0000000..06a6ce5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SR.png new file mode 100644 index 0000000..8845752 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SS.png new file mode 100644 index 0000000..17cf114 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ST.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ST.png new file mode 100644 index 0000000..6d2f828 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ST.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SUHH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SUHH.png new file mode 100644 index 0000000..19a7651 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SUHH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SV.png new file mode 100644 index 0000000..b6c5205 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SX.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SX.png new file mode 100644 index 0000000..276b243 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SX.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SY.png new file mode 100644 index 0000000..26c4bf2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SZ.png new file mode 100644 index 0000000..8eb3463 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/SZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TA.png new file mode 100644 index 0000000..bf1d320 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TC.png new file mode 100644 index 0000000..0690f4e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TD.png new file mode 100644 index 0000000..8c8ab44 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TF.png new file mode 100644 index 0000000..606bad0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TG.png new file mode 100644 index 0000000..9c53c46 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TH.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TH.png new file mode 100644 index 0000000..16c9507 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TH.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TJ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TJ.png new file mode 100644 index 0000000..d30f8a4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TJ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TK.png new file mode 100644 index 0000000..220ad83 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TL.png new file mode 100644 index 0000000..56e6cc1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TM.png new file mode 100644 index 0000000..878a5be Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TN.png new file mode 100644 index 0000000..2744ec0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TO.png new file mode 100644 index 0000000..f2e9d73 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TPTL.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TPTL.png new file mode 100644 index 0000000..56e6cc1 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TPTL.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TR.png new file mode 100644 index 0000000..183a981 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TT.png new file mode 100644 index 0000000..231f6f6 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TV.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TV.png new file mode 100644 index 0000000..b7b68d4 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TV.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TW.png new file mode 100644 index 0000000..d41adb9 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TZ.png new file mode 100644 index 0000000..f3c7323 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/TZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UA.png new file mode 100644 index 0000000..2689762 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UAUA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UAUA.png new file mode 100644 index 0000000..2003d40 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UAUA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UG-RW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UG-RW.png new file mode 100644 index 0000000..d8cf2a2 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UG-RW.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UG.png new file mode 100644 index 0000000..ccd668c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UK.png new file mode 100644 index 0000000..1eeabe0 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UM.png new file mode 100644 index 0000000..e78e68b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/US.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/US.png new file mode 100644 index 0000000..e78e68b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/US.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UY.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UY.png new file mode 100644 index 0000000..2ea2dcc Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UY.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UZ.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UZ.png new file mode 100644 index 0000000..00eb78a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/UZ.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VA.png new file mode 100644 index 0000000..d8bb787 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VC.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VC.png new file mode 100644 index 0000000..a903935 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VC.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VDVN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VDVN.png new file mode 100644 index 0000000..9e058aa Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VDVN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VE.png new file mode 100644 index 0000000..6d0ec5a Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VG.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VG.png new file mode 100644 index 0000000..0f0b395 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VG.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VI.png new file mode 100644 index 0000000..add0fde Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VN.png new file mode 100644 index 0000000..4b43106 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VNVN.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VNVN.png new file mode 100644 index 0000000..d95d93e Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VNVN.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VU.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VU.png new file mode 100644 index 0000000..ed29683 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/VU.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/WF.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/WF.png new file mode 100644 index 0000000..5194c2c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/WF.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/WKUM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/WKUM.png new file mode 100644 index 0000000..8b18a51 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/WKUM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/WS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/WS.png new file mode 100644 index 0000000..d20d338 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/WS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/XK.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/XK.png new file mode 100644 index 0000000..6bd7a0d Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/XK.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/YDYE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/YDYE.png new file mode 100644 index 0000000..66c5893 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/YDYE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/YE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/YE.png new file mode 100644 index 0000000..e5277ba Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/YE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/YEYE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/YEYE.png new file mode 100644 index 0000000..f601881 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/YEYE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/YT.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/YT.png new file mode 100644 index 0000000..59a71ca Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/YT.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/YUCS.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/YUCS.png new file mode 100644 index 0000000..8465076 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/YUCS.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZA-BO.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZA-BO.png new file mode 100644 index 0000000..6046b99 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZA-BO.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZA-CI.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZA-CI.png new file mode 100644 index 0000000..e6f4f0b Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZA-CI.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZA-TR.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZA-TR.png new file mode 100644 index 0000000..35be48f Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZA-TR.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZA-VE.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZA-VE.png new file mode 100644 index 0000000..dc7c376 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZA-VE.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZA.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZA.png new file mode 100644 index 0000000..14c6959 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZA.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZM.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZM.png new file mode 100644 index 0000000..7d733b5 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZM.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZRCD.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZRCD.png new file mode 100644 index 0000000..c4ad22c Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZRCD.png differ diff --git a/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZW.png b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZW.png new file mode 100644 index 0000000..e544601 Binary files /dev/null and b/demo/static/OxJS/dev/Ox.Geo/png/flags/64/ZW.png differ diff --git a/demo/static/OxJS/dev/Ox.Image/Ox.Image.js b/demo/static/OxJS/dev/Ox.Image/Ox.Image.js new file mode 100644 index 0000000..02de005 --- /dev/null +++ b/demo/static/OxJS/dev/Ox.Image/Ox.Image.js @@ -0,0 +1,820 @@ +'use strict'; + +Ox.load.Image = function(options, callback) { + + //@ Image + + /*@ + Ox.Image Generic image object + To render the image as an image element, use its `src()` method, to + render it as a canvas, use its `canvas` property. + (src, callback) -> undefined + (width, height[, background], callback) -> undefined + src Image source (local, remote or data URL) + width Width in px + height Height in px + background <[n]> Background color (RGB or RGBA) + callback Callback function + image Image object + > Ox.Image(1, 1, [255, 0, 0], function(i) { Ox.test(i.pixel([0, 0]), [255, 0, 0, 255]); }) + undefined + > Ox.Image(Ox.UI.PATH + 'themes/oxlight/png/icon16.png', function(i) { i.encode('foo', function(i) { i.decode(function(s) { Ox.test(s, 'foo'); })})}) + undefined + @*/ + Ox.Image = function() { + + var self = {}, + that = {}; + + function error(mode) { + throw new RangeError('PNG codec can\'t ' + mode + ' ' + ( + mode == 'encode' ? 'data' : 'image' + )); + } + + function getCapacity(bpb) { + var capacity = 0; + that.forEach(function(rgba) { + capacity += rgba[3] == 255 ? bpb * 3/8 : 0; + }); + return capacity; + } + + function getIndex(xy) { + return ( + Ox.mod(xy[0], self.width) + + Ox.mod(xy[1] * self.width, self.width * self.height) + ) * 4; + } + + function getXY(index) { + index /= 4; + return [index % self.width, Math.floor(index / self.width)]; + } + + function init() { + if (self.image) { + self.width = self.image.width; + self.height = self.image.height; + } + that.canvas = Ox.$('').attr({ + width: self.width, + height: self.height + }); + that.context = that.canvas[0].getContext('2d'); + if (self.image) { + that.context.drawImage(self.image, 0, 0); + } else if (!Ox.isEqual(self.background, [0, 0, 0, 0])) { + that.context.fillStyle = ( + self.background.length == 3 ? 'rgb' : 'rgba' + ) + '(' + self.background.join(', ') + ')'; + that.context.fillRect(0, 0, self.width, self.height); + } + self.imageData = that.context.getImageData( + 0, 0, self.width, self.height + ); + self.data = self.imageData.data; + self.callback(that); + } + + function parseDrawOptions(options) { + options = options || {}; + that.context.strokeStyle = options.width === 0 + ? 'rgba(0, 0, 0, 0)' : options.color || 'rgb(0, 0, 0)'; + that.context.fillStyle = options.fill || 'rgba(0, 0, 0, 0)'; + that.context.lineWidth = options.width !== void 0 + ? options.width : 1; + } + + function setSL(sl, d) { + var c = sl == 's' ? 1 : 2; + return that.map(function(rgba) { + var hsl = Ox.hsl([rgba[0], rgba[1], rgba[2]]); + hsl[c] = d < 0 ? hsl[c] * (d + 1) : hsl[c] + (1 - hsl[c]) * d; + return Ox.rgb(hsl).concat(rgba[3]); + }); + } + + /*@ + blur Apply blur filter + (val) -> The image object + val Amount of blur (1 to 5, more is slow) + @*/ + that.blur = function(val) { + var filter = [], + size = val * 2 + 1, + sum = 0 + Ox.loop(size, function(x) { + Ox.loop(size, function(y) { + var isInCircle = +(Math.sqrt( + Math.pow(x - val, 2) + Math.pow(y - val, 2) + ) <= val); + sum += isInCircle; + filter.push(isInCircle) + }); + }); + filter = filter.map(function(val) { + return val / sum; + }); + return that.filter(filter); + }; + + //@ canvas Canvas element + + /*@ + channel Reduce the image to one channel + (channel) -> The image object + channel 'r', 'g', 'b', 'a', 'h', 's' or 'l' + @*/ + that.channel = function(str) { + str = str[0].toLowerCase(); + return that.map(function(rgba) { + var i = ['r', 'g', 'b', 'a'].indexOf(str), rgb, val; + if (i > -1) { + return Ox.map(rgba, function(v, c) { + return str == 'a' + ? (c < 3 ? rgba[3] : 255) + : (c == i || c == 3 ? v : 0); + }); + } else { + i = ['h', 's', 'l'].indexOf(str); + val = Ox.hsl([rgba[0], rgba[1], rgba[2]])[i]; + rgb = i == 0 + ? Ox.rgb([val, 1, 0.5]) + : Ox.range(3).map(function() { + return Math.floor(val * 255); + }); + return rgb.concat(rgba[3]); + } + }); + }; + + //@ context 2D drawing context + + /*@ + contour Apply contour filter + () -> The image object + @*/ + that.contour = function(val) { + return that.filter([ + +1, +1, +1, + +1, -7, +1, + +1, +1, +1 + ]); + }; + + /*@ + depth Reduce the bit depth + (depth) -> The image object + depth Bits per channel (1 to 7) + @*/ + that.depth = function(val) { + var pow = Math.pow(2, 8 - val); + return that.map(function(rgba) { + return rgba.map(function(v, i) { + return i < 3 ? Math.floor(v / pow) * pow/* * 255 / val*/ : v; + }); + }); + }; + + /*@ + drawCircle Draws a circle + (point, radius, options) -> The image object + point <[n]> Center (`[x, y]`) + radius Radius in px + options Options + color CSS color + fill CSS color + width Line width in px + @*/ + that.drawCircle = function(point, radius, options) { + parseDrawOptions(options); + that.context.beginPath(); + that.context.arc(point[0], point[1], radius, 0, 2 * Math.PI); + that.context.fill(); + that.context.stroke(); + return that; + }; + + /*@ + drawLine Draws a line + (points, options) -> The image object + points <[a]> End points (`[[x1, y1], [x2, y2]]`) + options Options + color CSS color + width Line width in px + @*/ + that.drawLine = function(points, options, isPath) { + parseDrawOptions(options); + !isPath && that.context.beginPath(); + !isPath && that.context.moveTo(points[0][0], points[0][1]); + that.context.lineTo(points[1][0], points[1][1]); + !isPath && that.context.stroke(); + return that; + }; + + /*@ + drawPath Draws a path + (points, options) -> The image object + points <[a]> Points (`[[x1, y2], [x2, y2], ...]`) + options Options + color CSS color + fill CSS color + width Line width in px + @*/ + that.drawPath = function(points, options) { + var n = points.length; + parseDrawOptions(options); + that.context.beginPath(); + that.context.moveTo(points[0][0], points[0][1]); + Ox.loop(options.close ? n : n - 1, function(i) { + that.drawLine([points[i], points[(i + 1) % n]], options, true); + }); + that.context.fill(); + that.context.stroke(); + return that; + }; + + /*@ + drawRectangle Draws a rectangle + (point, size, options) -> The image object + point <[n]> Top left corner (`[x, y]`) + size <[n]> Width and height in px (`[w, h]`) + options Options + color CSS color + fill CSS color + width Line width in px + @*/ + that.drawRectangle = function(point, size, options) { + parseDrawOptions(options); + that.context.fillRect(point[0], point[1], size[0], size[1]); + that.context.strokeRect(point[0], point[1], size[0], size[1]); + return that; + }; + + /*@ + drawText Draws text + (text, point, options) -> The image object + text Text + point <[n]> Top left corner (`[x, y]`) + options Options + color CSS color + font CSS font + outline CSS border + textAlign CSS text-align + @*/ + that.drawText = function(text, point, options) { + options = options || {}; + var match = ( + options.outline || '0px rgba(0, 0, 0, 0)' + ).match(/^([\d\.]+)px (.+)$/), + outlineWidth = match[1], + outlineColor = match[2]; + that.context.fillStyle = options.color || 'rgb(0, 0, 0)'; + that.context.font = options.font || '10px sans-serif'; + that.context.strokeStyle = outlineColor; + that.context.lineWidth = outlineWidth; + that.context.textAlign = options.textAlign || 'start'; + that.context.fillText(text, point[0], point[1]) + that.context.strokeText(text, point[0], point[1]) + return that; + }; + + /*@ + edges Apply edges filter + () -> The image object + @*/ + that.edges = function(val) { + return that.filter([ + -1, -1, -1, + -1, +8, -1, + -1, -1, -1 + ]).saturation(-1); + }; + + /*@ + emboss Apply emboss filter + () -> The image object + @*/ + that.emboss = function(val) { + return that.filter([ + -1, -1, 0, + -1, 0, +1, + 0, +1, +1 + ], 128).saturation(-1); + }; + + /*@ + encode Encodes a string into the image + For most purposes, deflate and mode should be omitted, since the + defaults make the existence of the message harder to detect. A valid + use case for deflate and mode would be to first encode a more easily + detected decoy string, and only then the secret string: + `image.encode(decoy, false, 1, function(image) { + image.encode(secret, -1, callback); })`. + (str, callback) -> The image object (unmodified) + (str, deflate, callback) -> The image object (unmodified) + (str, mode, callback) -> The image object (unmodified) + (str, deflate, mode, callback) -> The image object (unmodified) + (str, mode, deflate, callback) -> The image object (unmodified) + str The string to be encoded + callback Callback function + image The image object (modified) + deflate If true, encode the string with deflate + mode Encoding mode + If mode is between -7 and 0, the string will be encoded one bit + per RGB byte, as the number of bits within that byte set to 1, + modulo 2, by flipping, if necessary, the most (mode -7) to least + (mode 0) significant bit. If mode is between 1 and 255, the + string will be encoded bitwise into all bits per RGB byte that, + in mode, are set to 1. + @*/ + that.encode = function(str) { + var callback = arguments[arguments.length - 1], + deflate = Ox.isBoolean(arguments[1]) ? arguments[1] + : Ox.isBoolean(arguments[2]) ? arguments[2] : true, + mode = Ox.isNumber(arguments[1]) ? arguments[1] + : Ox.isNumber(arguments[2]) ? arguments[2] : 0, + b = 0, bin, + // Array of bits per byte to be modified (0 is LSB) + bits = mode < 1 ? [-mode] : Ox.filter(Ox.range(8), function(i) { + return mode & 1 << i; + }), + cap = getCapacity(bits.length), len; + // Compress the string + str = Ox[deflate ? 'encodeDeflate' : 'encodeUTF8'](str); + len = str.length; + // Prefix the string with its length, as a four-byte value + str = Ox.pad(Ox.encodeBase256(len), 'left', 4, '\u0000') + str; + str.length > cap && error('encode'); + while (str.length < cap) { + str += str.substr(4, len); + } + str = str.slice(0, Math.ceil(cap)); + // Create an array of bit values + bin = Ox.flatten(Ox.map(str.split(''), function(chr) { + return Ox.range(8).map(function(i) { + return chr.charCodeAt(0) >> 7 - i & 1; + }); + })); + b = 0; + that.forEach(function(rgba, xy, index) { + // If alpha is not 255, the RGB values may not be preserved + if (rgba[3] == 255) { + Ox.loop(3, function(c) { + // fixme: use: var data = that.context.imageData.data[i + c] + var i = index + c; + Ox.forEach(bits, function(bit) { + if (( + mode < 1 + // If the number of bits set to 1, mod 2 + ? Ox.sum(Ox.range(8).map(function(bit) { + return +!!(self.data[i] & 1 << bit); + })) % 2 + // or the one bit in question + : +!!(self.data[i] & 1 << bit) + // is not equal to the data bit + ) != bin[b++]) { + // then flip the bit + self.data[i] ^= 1 << bit; + } + }); + }); + } + }, function() { + that.context.putImageData(self.imageData, 0, 0); + callback(that); + }); + return that; + }; + + /*@ + decode Decode encoded string + (callback) -> The image object (unmodified) + (deflate, callback) -> The image object (unmodified) + (mode, callback) -> The image object (unmodified) + (deflate, mode, callback) -> The image object (unmodified) + (mode, deflate, callback) -> The image object (unmodified) + deflate If true, decode the string with deflate + mode See encode method + callback Callback function + image The image object (modified) + @*/ + that.decode = function() { + var callback = arguments[arguments.length - 1], + deflate = Ox.isBoolean(arguments[0]) ? arguments[0] + : Ox.isBoolean(arguments[1]) ? arguments[1] : true, + mode = Ox.isNumber(arguments[0]) ? arguments[0] + : Ox.isNumber(arguments[1]) ? arguments[1] : 0, + bin = '', + // Array of bits per byte to be modified (0 is LSB) + bits = mode < 1 ? [-mode] : Ox.range(8).filter(function(i) { + return mode & 1 << i; + }), + done = 0, len = 4, str = ''; + that.forEach(function(rgba, xy, index) { + if (rgba[3] == 255) { + Ox.loop(3, function(c) { + var i = index + c; + Ox.forEach(bits, function(bit) { + bin += mode < 1 + // Read the number of bits set to 1, mod 2 + ? Ox.sum(Ox.range(8).map(function(bit) { + return +!!(self.data[i] & 1 << bit); + })) % 2 + // or the one bit in question + : +!!(self.data[i] & 1 << bit); + if (bin.length == 8) { + // Every 8 bits, add one byte to the string + str += Ox.char(parseInt(bin, 2)); + bin = ''; + if (str.length == len) { + if (++done == 1) { + // After 4 bytes, parse string as length + len = Ox.decodeBase256(str); + if ( + len <= 0 || + len > getCapacity(bits.length) - 4 + ) { + error('decode'); + } + str = ''; + } else { + // After length more bytes, break + return false; + } + } + } + }); + // If done == 2, break + return done < 2; + }); + // If done == 2, break + return done < 2; + } + }, function() { + try { + if (deflate) { + Ox.decodeDeflate(str, callback); + } else { + callback(Ox.decodeUTF8(str)); + } + } catch (e) { + error('decode'); + } + }); + return that; + }; + + /*@ + filter Pixel-wise filter function + Undocumented, see source code + (filter) -> The image object + (filter, bias) -> The image object + filter <[n]> Filter matrix + bias Bias + @*/ + that.filter = function(filter, bias) { + bias = bias || 0; + var filterSize = Math.sqrt(filter.length), + d = (filterSize - 1) / 2, + imageData = that.context.createImageData(self.width, self.height), + data = []; + self.imageData = that.context.getImageData(0, 0, self.width, self.height); + self.data = self.imageData.data; + Ox.loop(0, self.data.length, 4, function(i) { + var filterIndex = 0, + xy = getXY(i); + Ox.loop(3, function(c) { + data[i + c] = 0; + }); + Ox.loop(-d, d + 1, function(x) { + Ox.loop(-d, d + 1, function(y) { + var pixelIndex = getIndex([xy[0] + x, xy[1] + y]); + Ox.loop(3, function(c) { + data[i + c] += self.data[pixelIndex + c] * filter[filterIndex]; + }); + filterIndex++; + }); + }); + }); + Ox.loop(0, self.data.length, 4, function(i) { + Ox.loop(4, function(c) { + imageData.data[i + c] = c < 3 + ? Ox.limit(Math.round(data[i + c] + bias), 0, 255) + : self.data[i + c]; + }); + }); + that.context.putImageData(imageData, 0, 0); + self.imageData = imageData; + self.data = data; + return that; + }; + + /*@ + forEach Pixel-wise forEach loop + (fn) -> The image object + (fn, callback) -> The image object + fn Iterator function + rgba <[n]> RGBA values + xy <[n]> XY coordinates + i Pixel index + callback Callback function (if present, forEach is async) + @*/ + that.forEach = function(iterator, callback) { + var data = self.data, + forEach = callback ? Ox.nonblockingForEach : Ox.forEach; + forEach(Ox.range(0, data.length, 4), function(i) { + return iterator([ + data[i], data[i + 1], data[i + 2], data[i + 3] + ], getXY(i), i); + }, callback, 250); + return that; + }; + + /*@ + getSize Returns width and height + () -> Image size + width Width in px + height Height in px + @*/ + that.getSize = function() { + return {width: self.width, height: self.height}; + }; + + /*@ + hue Change the hue of the image + (val) -> The image object + val Hue, in degrees + @*/ + that.hue = function(val) { + return that.map(function(rgba) { + var hsl = Ox.hsl([rgba[0], rgba[1], rgba[2]]); + hsl[0] = (hsl[0] + val) % 360; + return Ox.rgb(hsl).concat(rgba[3]); + }); + }; + + /*@ + imageData Get or set image data + () -> ImageData object + data <+> CanvasPixelArray + see https://developer.mozilla.org/en/DOM/CanvasPixelArray + height Height in px + width Width in px + (imageData) -> Image object with new image data + imageData ImageData object + @*/ + that.imageData = function() { + if (arguments.length == 0) { + return self.imageData; + } else { + self.imageData = self.context.createImageData(arguments[0]); + } + }; + + /*@ + invert Apply invert filter + () -> The image object + @*/ + that.invert = function() { + return that.map(function(rgba) { + return [255 - rgba[0], 255 - rgba[1], 255 - rgba[2], rgba[3]]; + }); + }; + + /*@ + lightness Apply lightness filter + (val) -> The image object + val Amount, from -1 (darkest) to 1 (lightest) + @*/ + that.lightness = function(val) { + return setSL('l', val); + }; + + /*@ + map Pixel-wise map function + (fn) -> The image object + fn Iterator function + rgba <[n]> RGBA values + xy <[n]> XY coordinates + i Pixel index + @*/ + that.map = function(fn, callback) { + self.imageData = that.context.getImageData( + 0, 0, self.width, self.height + ); + self.data = self.imageData.data; + that.forEach(function(rgba, xy, i) { + fn(rgba, xy, i).forEach(function(val, c) { + self.data[i + c] = val; + }); + }); + that.context.putImageData(self.imageData, 0, 0); + return that; + }; + + /*@ + mosaic Apply mosaic filter + (size) -> The image object + size Mosaic size + @*/ + that.mosaic = function(size) { + that.forEach(function(rgba, xy) { + if (xy[0] % size == 0 && xy[1] % size == 0) { + Ox.loop(size, function(x) { + Ox.loop(size, function(y) { + var hsl, rgb, xy_ = [xy[0] + x, xy[1] + y]; + if ( + (x == 0 || y == 0) + && !(x == size - 1 || y == size - 1) + ) { + that.pixel(xy_, rgba.map(function(c, i) { + return i < 3 ? Math.min(c + 16, 255) : c; + })); + } else if ( + (x == size - 1 || y == size - 1) + && !(x == 0 || y == 0) + ) { + that.pixel(xy_, rgba.map(function(c, i) { + return i < 3 ? Math.max(c - 16, 0) : c; + })); + } else { + that.pixel(xy_, rgba); + } + }); + }); + } + }); + that.context.putImageData(self.imageData, 0, 0); + return that; + }; + + /*@ + motionBlur Apply motion blur filter + () -> The image object + @*/ + that.motionBlur = function() { + return that.filter([ + 0.2, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.2, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.2, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.2, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.2 + ]); + }; + + /*@ + photocopy Apply photocopy filter + () -> The image object + @*/ + that.photocopy = function(val) { + return that.saturation(-1).depth(1).blur(1); + }; + + /*@ + pixel Get or set pixel values + (xy) -> <[n]> RGBA values + (x, y) -> <[n]> RGBA values + (xy, val) -> The image object + (x, y, val) -> The image object + x X coordinate + y Y coordinate + xy <[n]> XY coordinates ([x, y]) + val <[n]> RGBA values + @*/ + that.pixel = function() { + var xy = Ox.isArray(arguments[0]) + ? arguments[0] : [arguments[0], arguments[1]], + val = arguments.length > 1 && Ox.isArray(Ox.last(arguments)) + ? Ox.last(arguments) : null, + i = getIndex(xy), + ret; + if (!val) { + ret = Ox.range(4).map(function(c) { + return self.data[i + c]; + }); + } else { + val.forEach(function(v, c) { + self.data[i + c] = v; + }); + that.context.putImageData(self.imageData, 0, 0); + ret = that; + } + return ret; + }; + + /*@ + posterize Apply posterize filter + () -> The image object + @*/ + that.posterize = function() { + return that.blur(3).map(function(rgba) { + return [ + Math.floor(rgba[0] / 64) * 64, + Math.floor(rgba[1] / 64) * 64, + Math.floor(rgba[2] / 64) * 64, + rgba[3] + ]; + }); + }; + + that.resize = function(width, height) { + // fixme: doesn't work this way + that.canvas.attr({ + width: width, + height: height + }); + return that; + }; + + /*@ + saturation Apply saturation filter + (val) -> The image object + val Amount, from -1 (lowest) to 1 (highest) + @*/ + that.saturation = function(val) { + return setSL('s', val); + }; + + /*@ + sharpen Apply sharpen filter + () -> The image object + @*/ + that.sharpen = function(val) { + return that.filter([ + -1, -1, -1, + -1, +9, -1, + -1, -1, -1 + ]); + }; + + /*@ + solarize Apply solarize filter + () -> The image object + @*/ + that.solarize = function() { + return that.map(function(rgba) { + return [ + rgba[0] < 128 ? rgba[0] : 255 - rgba[0], + rgba[1] < 128 ? rgba[1] : 255 - rgba[1], + rgba[2] < 128 ? rgba[2] : 255 - rgba[2], + rgba[3] + ]; + }); + }; + + /*@ + src Get or set the image source + () -> Data URL + (src) -> Image object with new source + src Image source (local, remote or data URL) + @*/ + that.src = function() { + var ret; + if (arguments.length == 0) { + ret = that.canvas[0].toDataURL(); + } else { + var callback = arguments[1]; + self.src = arguments[0]; + self.image = new Image(); + self.image.onload = function() { + self.width = self.image.width; + self.height = self.image.height; + that.canvas.attr({ + width: self.width, + height: self.height + }); + that.context.drawImage(self.image, 0, 0); + self.imageData = that.context.getImageData( + 0, 0, self.width, self.height + ); + self.data = self.imageData.data; + callback && callback(that); + } + self.image.src = self.src; + ret = that; + } + return ret; + }; + + self.callback = arguments[arguments.length - 1]; + if (arguments.length == 2) { + self.src = arguments[0]; + self.image = new Image(); + self.image.onload = init; + self.image.src = self.src; + } else { + self.width = arguments[0]; + self.height = arguments[1]; + self.background = arguments.length == 4 + ? arguments[2] : [0, 0, 0, 0]; + init(); + } + + }; + + callback(true); + +} + diff --git a/demo/static/OxJS/dev/Ox.UI/Ox.UI.js b/demo/static/OxJS/dev/Ox.UI/Ox.UI.js new file mode 100644 index 0000000..b9a941d --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/Ox.UI.js @@ -0,0 +1,528 @@ +'use strict'; + +Ox.load.UI = function(options, callback) { + + options = Ox.extend({ + hideScreen: true, + showScreen: false, + theme: 'oxlight' + }, options); + + var browsers = [ + { + name: 'Chrome Frame', + url: 'http://www.google.com/chromeframe/' + }, + { + name: 'Chrome', + regexp: /Chrome\/(\d+)\./, + url: 'http://www.google.com/chrome/', + version: 10 + }, + { + name: 'Firefox', + regexp: /Firefox\/(\d+)\./, + url: 'http://www.mozilla.org/firefox/', + version: 4 + }, + { + name: 'Safari', + regexp: /Version\/(\d+).*? Safari/, + url: 'http://www.apple.com/safari/', + version: 5 + }, + { + name: 'WebKit', + regexp: /AppleWebKit\/(\d+)\./, + version: 534 + }, + { + name: 'Googlebot', + regexp: /Googlebot\/(\d+)\./, + version: 2 + }, + { + name: 'Internet Explorer', + url: 'http://windows.microsoft.com/en-US/internet-explorer/products/ie/home', + version: 9 + } + ], + browserSupported = false, + colors = { + marker: { + '#000000': 'videoMarkerBorder', + '#FFFFFF': 'videoMarkerBackground' + }, + symbol: { + '#FF0000': 'symbolWarningColor' + } + }, + images = {}, + isInternetExplorer = /MSIE/.test(navigator.userAgent), + loadingInterval, + themes = {}; + + browsers.forEach(function(browser) { + var match = browser.regexp && browser.regexp.exec(navigator.userAgent); + if (match && match[1] >= browser.version) { + browserSupported = true; + } + }); + + Ox.documentReady(function() { + Ox.$('body').addClass( + 'OxTheme' + Ox.toTitleCase(options.theme || 'oxlight') + ); + options.showScreen && showScreen(); + }); + + loadFiles(); + + function showScreen() { + + var body = Ox.$('body'), + css = { + position: 'absolute', + left: 0, + top: 0, + right: 0, + bottom: 0, + margin: 'auto', + MozUserSelect: 'none', + WebkitUserSelect: 'none' + }, + div = Ox.$('
') + .addClass('OxLoadingScreen') + .css({ + position: 'absolute', + left: 0, + top: 0, + right: 0, + bottom: 0, + padding: '4px', + background: 'rgb(' + ( + options.theme == 'oxlight' ? '240, 240, 240' + : options.theme == 'oxmedium' ? '144, 144, 144' + : '16, 16, 16' + ) + ')', + opacity: 1, + zIndex: 1000 + }) + .appendTo(body); + + browserSupported ? showIcon() : showWarning(); + + function showIcon() { + /* + // SVG transform performs worse than CSS transform + var src = Ox.PATH + 'Ox.UI/themes/' + options.theme + '/svg/symbolLoadingAnimated.svg' + Ox.getFile(src, function() { + Ox.$('') + .attr({ + src: src + }) + .css(Ox.extend({ + width: '32px', + height: '32px' + }, css)) + .on({ + mousedown: function(e) { + e.preventDefault(); + } + }) + .appendTo(div); + }); + */ + var deg = 0, + element, + src = Ox.PATH + 'Ox.UI/themes/' + options.theme + '/svg/symbolLoading.svg' + Ox.getFile(src, function() { + element = Ox.$('') + .attr({ + src: src + }) + .css(Ox.extend({ + width: '32px', + height: '32px' + }, css)) + .on({ + mousedown: function(e) { + e.preventDefault() + } + }) + .appendTo(div); + loadingInterval = setInterval(function() { + deg = (deg + 30) % 360; + element.css({ + MozTransform: 'rotate(' + deg + 'deg)', + OTransform: 'rotate(' + deg + 'deg)', + WebkitTransform: 'rotate(' + deg + 'deg)' + }); + }, 83); + }); + } + + function showWarning() { + var counter = 0; + /* + message = 'Browser not supported, use ' + browsers.map(function(browser, i) { + return browser.name + ( + i == browsers.length - 1 ? '.' : + i == browsers.length - 2 ? ' or' : ',' + ); + }).join(' '); + */ + div.addClass('OxError'); + browsers = browsers.filter(function(browser) { + return browser.url; + }); + isInternetExplorer ? browsers.pop() : browsers.shift(); + browsers.forEach(function(browser) { + browser.src = Ox.PATH + 'Ox.UI/png/browser' + browser.name.replace(' ', '') + '128.png'; + Ox.getFile(browser.src, function() { + ++counter == browsers.length && showIcons(); + }); + }); + function showIcons() { + var box = Ox.$('
') + .css(Ox.extend({ + width: (browsers.length * 72) + 'px', + height: '72px' + }, css)) + .appendTo(div); + browsers.forEach(function(browser, i) { + var link = Ox.$('') + .attr({ + href: browser.url, + title: (browser.name == 'Chrome Frame' ? 'Install' : 'Download') + + ' ' + browser.name + }) + .css({ + position: 'absolute', + left: (i * 72) + 'px', + width: '72px', + height: '72px' + }) + .appendTo(box); + Ox.$('') + .attr({ + src: browser.src + }) + .css(Ox.extend({ + width: '64px', + height: '64px', + border: 0, + cursor: 'pointer' + }, css)) + .on({ + mousedown: function(e) { + e.preventDefault(); + } + }) + .appendTo(link); + }); + } + + } + + } + + function loadFiles() { + + Ox.getFile(Ox.PATH + '/Ox.UI/jquery/jquery.js', function() { + initUI(); + Ox.getJSON(Ox.UI.PATH + 'json/Ox.UI.json?' + Ox.VERSION, function(data) { + var counter = 0, length = data.files.length; + images = data.images; + data.files.forEach(function(file) { + if (/\.jsonc$/.test(file)) { + Ox.getJSONC(Ox.PATH + file + '?' + Ox.VERSION, function(data) { + var theme = /\/themes\/(\w+)\/json\//.exec(file)[1]; + themes[theme] = data; + ++counter == length && initThemes(); + }); + } else { + Ox.getFile(Ox.PATH + file, function() { + ++counter == length && initThemes(); + }); + } + }); + }); + }); + + } + + function initThemes() { + + Ox.Theme.getThemes = function() { + return Object.keys(themes); + }; + Ox.Theme.getThemeData = function(theme) { + return themes[theme || Ox.Theme()]; + }; + $(function() { + if (options.showScreen && options.hideScreen) { + Ox.UI.hideLoadingScreen(); + } + callback(browserSupported); + }); + + } + + function initUI() { + + //@ UI + //@ Ox.UI Collection of UI methods and properties + Ox.UI = {}; + + /*@ + Ox.UI.ready queue callback to be called once UI is ready + (callback) -> call callback later + @*/ + Ox.UI.ready = (function() { + var callbacks = []; + $(function() { + // FIXME: use Ox.$foo everywhere! + Ox.$body = Ox.UI.$body = $('body'); + Ox.$document = Ox.UI.$document = $(document); + Ox.$head = Ox.UI.$head = $('head'); + Ox.$window = Ox.UI.$window = $(window); + // fixme: is this the right place to do this? + $.browser.mozilla && Ox.$document.on('dragstart', function() { + return false; + }); + callbacks.forEach(function(callback) { + callback(); + }); + //delete callbacks; + }); + return function(callback) { + if (Ox.$window) { + callback(); + } else { + callbacks.push(callback); + } + } + }()); + + //@ Ox.UI.DIMENSIONS horizontal, vertical dimensions + Ox.UI.DIMENSIONS = { + horizontal: ['width', 'height'], + vertical: ['height', 'width'] + }; + //@ Ox.UI.EDGES horizontal, vertical edges + Ox.UI.EDGES = { + horizontal: ['left', 'right', 'top', 'bottom'], + vertical: ['top', 'bottom', 'left', 'right'] + }; + //@ Ox.UI.elements reference to all UI element instnaces + Ox.UI.elements = {}; + /*@ + Ox.UI.getImageData Returns image properties + (url) -> Image Name + @*/ + Ox.UI.getImageData = Ox.cache(function(url) { + var str = 'data:image/svg+xml;base64,'; + return Ox.startsWith(url, str) + ? JSON.parse(atob(url.split(',')[1]).match(//)[1]) + : null; + }); + /*@ + Ox.UI.getImageURL Returns an image URL + (name[, color[, theme]]) -> Image URL + name Image name + color Color name or RGB values + theme Theme name + @*/ + Ox.UI.getImageURL = Ox.cache(function(name, color, theme) { + var colorName, + image = images[name], + themeData, + type = Ox.toDashes(name).split('-')[0]; + color = color || 'default'; + theme = theme || Ox.Theme(); + themeData = Ox.Theme.getThemeData(theme); + if (type == 'symbol') { + if (Ox.isString(color)) { + colorName = color; + color = themeData['symbol' + Ox.toTitleCase(color) + 'Color']; + } + image = image.replace(/#808080/g, '#' + Ox.toHex(color)); + } + Ox.forEach(colors[type], function(name, hex) { + image = image.replace( + new RegExp(hex, 'g'), + '$' + Ox.toHex(themeData[name]) + ); + }); + image = image.replace(/\$/g, '#'); + return 'data:image/svg+xml;base64,' + btoa( + image + '' + ); + }, { + key: function(args) { + args[1] = args[1] || 'default'; + args[2] = args[2] || Ox.Theme(); + return JSON.stringify(args); + } + }); + /*@ + Ox.UI.getVideoFormat Get supported video formats + (formats) -> of supported formats + formats list of available formats + @*/ + Ox.UI.getVideoFormat = function(formats) { + var aliases = { + 'mp4': 'h264', + 'm4v': 'h264', + 'ogv': 'ogg' + }, + format, + tests = { + 'h264': 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"', + 'ogg': 'video/ogg; codecs="theora, vorbis"', + 'webm': 'video/webm; codecs="vp8, vorbis"' + }, + userAgent = navigator.userAgent.toLowerCase(), + video = document.createElement('video'); + Ox.forEach(formats, function(f) { + var alias = aliases[f] || f; + if (!!(video.canPlayType && video.canPlayType(tests[alias]).replace('no', ''))) { + // disable WebM on Safari/Perian, seeking does not work + if (!( + alias == 'webm' && /safari/.test(userAgent) + && !/chrome/.test(userAgent) && !/linux/.test(userAgent) + )) { + format = f; + return false; // break + } + } + }); + return format; + }; + /*@ + Ox.UI.hideLoadingScreen hide loading screen + () -> hide loading screen + @*/ + Ox.UI.hideLoadingScreen = function() { + var $div = $('.OxLoadingScreen'), + error = $div.is('.OxError'); + //$div.find('img').remove(); + $div.animate({ + opacity: error ? 0.9 : 0 + }, 1000, function() { + if (error) { + $div.click(function() { + $div.remove(); + }); + } else { + clearInterval(loadingInterval); + $div.remove(); + } + }); + }; + /*@ + Ox.UI.isElement Checks if an object is an Ox.Element + (obj) -> True if object is an Ox.Element + @*/ + Ox.UI.isElement = function(object) { + return Ox.isObject(object) && 'oxid' in object; + }; + //@ Ox.UI.PATH Path of Ox.UI + Ox.UI.PATH = Ox.PATH + 'Ox.UI/'; + //@ Ox.UI.SCOLLBAR_SIZE size of scrollbar + Ox.UI.SCROLLBAR_SIZE = $.browser.webkit ? 8 : (function() { + var inner = $('

').css({ + height: '200px', + width: '100%' + }), + outer = $('

').css({ + height: '150px', + left: 0, + overflow: 'hidden', + position: 'absolute', + top: 0, + visibility: 'hidden', + width: '200px' + }).append(inner).appendTo($('body')), + width; + width = inner[0].offsetWidth; + outer.css({overflow: 'scroll'}); + width = 1 + width - (inner[0].offsetWidth == width + ? outer[0].clientWidth : inner[0].offsetWidth); + outer.remove(); + return width; + })(); + //@ Ox.UI.getBarSize get bar size by name + // fixme: the follwing should be deprecated + Ox.UI.getBarSize = function(size) { + var sizes = { + small: 20, + medium: 24, + large: 28 + }; + return sizes[size]; + }; + //@ Ox.UI.symbols unicode symbols + Ox.UI.symbols = { + alt: '\u2325', + apple: '\uF8FF', + arrow_down: '\u2193', + arrow_left: '\u2190', + arrow_right: '\u2192', + arrow_up: '\u2191', + backspace: '\u232B', + backup: '\u2707', + ballot: '\u2717', + black_star: '\u2605', + burn: '\u2622', + caps_lock: '\u21EA', + check: '\u2713', + //clear: '\u2327', + clear: '\u00D7', + click: '\uF803', + close: '\u2715', + command: '\u2318', + control: '\u2303', + cut: '\u2702', + 'delete': '\u2326', + diamond: '\u25C6', + edit: '\uF802', + eject: '\u23CF', + escape: '\u238B', + end: '\u2198', + enter: '\u2324', + fly: '\u2708', + gear: '\u2699', + home: '\u2196', + info: '\u24D8', + navigate: '\u2388', + option: '\u2387', + page_up: '\u21DE', + page_down: '\u21DF', + redo: '\u21BA', + 'return': '\u21A9', + //select: '\u21D5', + select: '\u25BE', + shift: '\u21E7', + sound: '\u266B', + space: '\u2423', + tab: '\u21E5', + trash: '\u267A', + triangle_down: '\u25BC', + triangle_left: '\u25C0', + triangle_right: '\u25BA', + triangle_up: '\u25B2', + undo: '\u21BB', + voltage: '\u26A1', + warning: '\u26A0', + white_star: '\u2606' + }; + + } + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/css/Ox.UI.css b/demo/static/OxJS/dev/Ox.UI/css/Ox.UI.css new file mode 100644 index 0000000..3555b70 --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/css/Ox.UI.css @@ -0,0 +1,2744 @@ +@import url("../themes/aqua/css/theme.css"); +@import url("../themes/oxdark/css/theme.css"); +@import url("../themes/oxlight/css/theme.css"); +@import url("../themes/oxmedium/css/theme.css"); + +/* +================================================================================ +Base +================================================================================ +*/ + +a { + text-decoration: none; +} +a:hover, .OxLink:hover { + text-decoration: underline; + cursor: pointer; +} +blockquote { + margin: 0 1.5em 0 1.5em; +} +body { + margin: 0; + overflow: hidden; + -moz-user-select: -moz-none; + -o-user-select: none; + -webkit-user-select: none; +} +code, pre { + font-family: Menlo, Monaco, DejaVu Sans Mono, Lucida Console, Consolas, Bitstream Vera Sans Mono, monospace; +} +div { + -moz-user-select: -moz-none; + -o-user-select: none; + -webkit-user-select: none; +} +div, input, textarea { + font-family: Lucida Grande, Segoe UI, DejaVu Sans, Lucida Sans Unicode, Helvetica, Arial, sans-serif; + font-size: 11px; +} +h1, h2, h3, h4, h5, h6 { + margin: 0; + font-size: 16px; + font-weight: normal; +} +h2, h3, h4, h5, h6 { + font-size: 14px; +} +img { + -moz-user-drag: none; + -o-user-drag: none; + -webkit-user-drag: none; +} +ol, ul { + padding-left: 1.5em; + margin: 0; +} +p { + text-align: justify; +} +p:first-child { + margin-top: 0; +} +p:last-child { + margin-bottom: 0; +} +td { + padding: 0; + vertical-align: top; +} + +.OxSerif { + font-family: Georgia, Palatino, DejaVu Serif, Book Antiqua, Palatino Linotype, Times New Roman, serif; +} +.OxSansSerif { + font-family: Lucida Grande, Segoe UI, DejaVu Sans, Lucida Sans Unicode, Helvetica, Arial, sans-serif; +} +.OxMonospace { + font-family: Menlo, Monaco, DejaVu Sans Mono, Lucida Console, Consolas, Bitstream Vera Sans Mono, monospace; +} + +.OxSelectable { + -moz-user-select: text; + -o-user-select: text; + -webkit-user-select: text; +} + +/* +================================================================================ +Audio +================================================================================ +*/ + +.OxAudioPlayer { + position: absolute; + height: 31px; +} +.OxAudioPlayer > * { + position: absolute; +} +.OxAudioPlayer > .OxMuteButton { + right: 151px; + top: 15px; +} +.OxAudioPlayer > .OxPlayButtons { + top: 15px; +} +.OxAudioPlayer > .OxButtonGroup.OxPlayButtons > .OxButton:first-child { + border-top-left-radius: 0; +} +.OxAudioPlayer > .OxPositionLabel { + top: 15px; + height: 13px; + padding-top: 1px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + font-size: 10px; +} +.OxAudioPlayer > .OxPositionSlider { + left: 46px; + top: 15px; +} +.OxAudioPlayer > .OxRepeatButton { + border-bottom-left-radius: 0; +} +.OxAudioPlayer > .OxShuffleButton { + right: 0; + border-bottom-right-radius: 0; +} +.OxAudioPlayer > .OxTrackLabel { + left: 15px; + top: 0; + height: 13px; + padding-top: 1px; + font-size: 10px; + text-overflow: ellipsis; +} +.OxAudioPlayer > .OxVolumeLabel { + top: 15px; + height: 13px; + padding-top: 1px; + border-top-right-radius: 0; + font-size: 10px; +} +.OxAudioPlayer > .OxVolumeSlider { + right: 35px; + top: 15px; +} + +/* +================================================================================ +Core +================================================================================ +*/ + +.OxContainer { + left: 0; + top: 0; + right: 0; + bottom: 0; + //overflow: hidden; + overflow: auto; +} +.OxContent { + //overflow: auto; +} + +/* +================================================================================ +Bars +================================================================================ +*/ + +.OxBar { + overflow: hidden; + white-space: nowrap; +} + +.OxProgressbar { + height: 14px; + border-width: 1px; + border-style: solid; + border-radius: 8px; +} +.OxProgressbar .OxTrack { + float: left; + width: 14px; + height: 14px; + border-width: 1px; + border-style: solid; + border-radius: 8px; + margin: -1px; +} +.OxProgressbar .OxProgress { + width: 14px; + height: 14px; + border-width: 1px; + border-style: solid; + border-radius: 8px; + margin: -1px; +} +.OxProgressbar .OxProgress.OxAnimate { + -webkit-animation: progress 1s linear infinite; +} +@-webkit-keyframes progress { + 0% { + background-position: 0 0; + } + 100% { + background-position: -32px 0; + } +} +.OxProgressbar .OxText { + float: left; + height: 14px; + //padding-top: 2px; + //font-size: 8px; + text-align: center; +} +.OxProgressbar .OxText.OxSmall { + //padding-top: 1px; + //font-size: 9px; +} +.OxProgressbar .OxButton { + float: left; + margin: -1px; +} + + +.OxResizebar { + z-index: 2; +} +.OxResizebar:hover > .OxSpace { + //background: rgba(128, 128, 128, 0.25); +} + +.OxResizebar.OxHorizontal { + width: 100%; + height: 5px; + margin: -2px 0 -2px 0; +} +.OxResizebar.OxHorizontal > .OxLine { + width: 100%; + height: 1px; +} +.OxResizebar.OxHorizontal > .OxSpace { + width: 100%; + height: 2px; +} + +.OxResizebar.OxVertical { + width: 5px; + height: 100%; + margin: 0 -2px 0 -2px; +} +.OxResizebar.OxVertical > .OxLine { + float: left; + width: 1px; + height: 100%; +} +.OxResizebar.OxVertical > .OxSpace { + float: left; + width: 2px; + height: 100%; +} + +.OxTabbar > .OxButtonGroup { + margin: 4px 0 0 4px; +} + +/* +================================================================================ +Calendar +================================================================================ +*/ + +.OxCalendar { + position: absolute; + overflow: hidden; +} + +.OxCalendar > .OxCalendarContainer { + position: absolute; + left: 0; + right: 0; + overflow: hidden; +} +.OxCalendar > .OxCalendarContent { + position: absolute; +} + +.OxCalendar .OxBackground { + position: absolute; + top: 0; + bottom: 0; +} +.OxCalendar .OxBackground > div { + position: absolute; + top: 0; + bottom: 0; +} + +.OxCalendar .OxLine { + position: absolute; +} + +.OxCalendar .OxEvent { + position: absolute; + height: 15px; + padding-top: 1px; + text-overflow: ellipsis; + cursor: pointer; + overflow: hidden; + white-space: nowrap; +} +.OxCalendar .OxEvent .OxEventText { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} +.OxCalendar .OxLine > .OxEvent { + //box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.5); + border-radius: 4px; +} +.OxCalendar .OxLine > .OxEvent.OxCurrent { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.OxCalendar .OxTimeline { + position: absolute; + height: 16px; + //overflow: hidden; +} + +.OxCalendar .OxTimeline .OxEvent { + position: absolute; + border-radius: 0; + cursor: ew-resize; +} +.OxCalendar .OxOverlay { + position: absolute; + left: 0; + right: 0; + height: 16px; +} +.OxCalendar .OxOverlay div { + position: absolute; + height: 16px; + cursor: ew-resize; +} +.OxCalendar .OxOverlay div:nth-child(even) { + border-radius: 4px; +} + +.OxCalendar .OxCalendarControl, +.OxCalendar .OxEventControl { + position: absolute; +} +.OxCalendar .OxCalendarControl.OxCalendarButtonCenter { + left: 24px; +} +.OxCalendar .OxCalendarControl.OxCalendarButtonDown { + left: 24px; +} +.OxCalendar .OxCalendarControl.OxCalendarButtonLeft { + left: 4px; +} +.OxCalendar .OxCalendarControl.OxCalendarButtonRight { + left: 44px; +} +.OxCalendar .OxCalendarControl.OxCalendarButtonUp { + left: 24px; +} + +.OxCalendar .OxEventControl.OxEventName { + right: 24px; + width: 128px; + text-overflow: ellipsis; +} +.OxCalendar .OxEventControl.OxEventDeselectButton { + right: 4px; +} + +.OxCalendar .OxRange .OxArrow { + border-radius: 0; +} + + +/* +================================================================================ +Dialog +================================================================================ +*/ + +.OxDialog { + position: absolute; + border-radius: 8px; + z-index: 11; +} + +.OxDialog > .OxTitlebar { + position: absolute; + height: 24px; + text-align: center; + border-top-left-radius: 8px; + border-top-right-radius: 8px; +} + +.OxDialog > .OxTitlebar > .OxButton { + position: absolute; +} + +.OxDialog > .OxTitlebar > .OxTitle { + margin-top: 4px; + font-size: 11px; + font-weight: bold; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.OxDialog > .OxContent { + position: absolute; + left: 0; + top: 24px; + right: 0; + overflow: auto; +} + +.OxDialog > .OxButtonsbar { + position: absolute; + bottom: 0; + height: 24px; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + cursor: move; +} +.OxDialog > .OxButtonsbar > .OxButtonsLeft { + margin-left: 4px; + float: left; +} +.OxDialog > .OxButtonsbar > .OxButtonsRight { + margin-right: 4px; + float: right; +} +.OxDialog > .OxButtonsbar .OxButton { + margin: 4px 2px 4px 2px; +} + +.OxDialog > .OxResize { + position: absolute; + z-index: 12; +} +.OxDialog > .OxResizeTopLeft { + left: -2px; + top: -2px; + width: 10px; + height: 10px; + cursor: nwse-resize; +} +.OxDialog > .OxResizeTop { + left: 8px; + top: -2px; + right: 8px; + height: 5px; + cursor: ns-resize; +} +.OxDialog > .OxResizeTopRight { + right: -2px; + top: -2px; + width: 10px; + height: 10px; + cursor: nesw-resize; +} +.OxDialog > .OxResizeLeft { + left: -2px; + top: 8px; + width: 5px; + bottom: 8px; + cursor: ew-resize; +} +.OxDialog > .OxResizeRight { + right: -2px; + top: 8px; + width: 5px; + bottom: 8px; + cursor: ew-resize; +} +.OxDialog > .OxResizeBottomLeft { + left: -2px; + bottom: -2px; + width: 10px; + height: 10px; + cursor: nesw-resize; +} +.OxDialog > .OxResizeBottom { + left: 8px; + bottom: -2px; + right: 8px; + height: 5px; + cursor: ns-resize; +} +.OxDialog > .OxResizeBottomRight { + right: -2px; + bottom: -2px; + width: 10px; + height: 10px; + cursor: nwse-resize; +} + +.OxDialogBox { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + overflow: hidden; +} + +/* +================================================================================ +Document +================================================================================ +*/ + +.OxDocument { + padding: 8px; + -moz-user-select: text; + -o-user-select: text; + -webkit-user-select: text; +} +.OxDocument div { + border-width: 0; + border-style: solid; + //font-family: Georgia, Palatino, DejaVu Serif, Book Antiqua, Palatino Linotype, Times New Roman, serif; + font-size: 12px; + line-height: 18px; + -moz-user-select: text; + -o-user-select: text; + -webkit-user-select: text; +} +.OxDocument h1 { + font-weight: bold; + font-size: 20px; + line-height: 24px; +} +.OxDocument table { + border-spacing: 0; + //border: 1px solid red; +} +.OxDocument td { + padding: 0 4px 0 4px; + //border: 1px solid rgb(128, 128, 128); + vertical-align: top; +} +.OxDocument td:first-child { + padding-left: 0; +} +.OxDocument td:last-child { + padding-right: 0; +} + +.OxDocument code { + font-size: 12px; +} +.OxDocument .OxSyntaxHighlighter div { + font-size: 11px; + line-height: 16px; +} + +/* +================================================================================ +Documentation +================================================================================ +*/ + +.OxDocPage code { + //border: 1px solid rgb(232, 232, 232); + //background: rgb(248, 248, 248); + white-space: nowrap; +} +.OxDocPage .OxSection { + font-family: Lucida Grande, Segoe UI, DejaVu Sans, Lucida Sans Unicode, Helvetica, Arial, sans-serif; + font-weight: bold; + font-size: 12px; +} + +/* +================================================================================ +Drag & Drop +================================================================================ +*/ + +.OxDrag { + cursor: move; + opacity: 0.5; +} + +/* +================================================================================ +Forms +================================================================================ +*/ + +input { + border: 1px; +} +input, +textarea { + padding: 0; + //border: 1px; + margin: 0; +} +input[type=button], +input[type=reset], +input[type=submit] { + -moz-box-sizing: content-box; + -o-box-sizing: content-box; + -webkit-box-sizing: content-box; +} +input[type=image] { + cursor: default; + -moz-user-select: none; + -o-user-select: none; + -webkit-user-select: none; +} +input:focus, +textarea:focus { + outline: none; +} +/* +input.OxXlarge { + height: 26px; + font-size: 19px; + padding: 0 12px 0 12px; + -moz-border-radius: 14px; + -webkit-border-radius: 14px; +} +input.OxLarge { + height: 22px; + font-size: 16px; + padding: 0 10px 0 10px; + -moz-border-radius: 12px; + -webkit-border-radius: 12px; +} +*/ +input.OxLarge { + height: 18px; + padding: 0 8px 0 8px; + font-size: 13px; + line-height: 18px; + border-radius: 10px; +} +input.OxMedium { + height: 14px; + padding: 0 6px 0 6px; + font-size: 11px; + line-height: 14px; + border-radius: 8px; +} +input.OxMedium.OxRounded { + padding: 0 6px 0 6px; + border-radius: 8px; +} +input.OxMedium.OxSquare { + padding: 0 2px 0 2px; + border-radius: 0; +} +input.OxSmall { + height: 10px; + padding: 0 4px 0 4px; + font-size: 8px; + line-height: 10px; + border-radius: 6px; +} + +input[type=image] { + height: 10px; + width: 10px; + padding: 2px; +} + +input::-moz-focus-inner { + border: none; +} +textarea { + padding: 2px 6px 2px 6px; + //padding: 0 4px 0 4px; + border-radius: 8px; + resize: none; +} +textarea.OxSquare { + border-radius: 0; +} + +/* +-------------------------------------------------------------------------------- +OxArrayEditable +-------------------------------------------------------------------------------- +*/ + +.OxArrayEditable { + line-height: 14px; +} +.OxArrayEditable.OxArrayEditableInput { + padding: 4px; +} +.OxArrayEditable.OxArrayEditableTextarea .OxEditableElement { + padding: 4px; + border-top-width: 1px; + border-top-style: solid; +} +.OxArrayEditable.OxArrayEditableTextarea textarea { + padding: 4px; +} +.OxArrayEditable.OxArrayEditableTextarea .OxEditableElement:first-child { + border-top: 0px +} + +/* +-------------------------------------------------------------------------------- +OxButton +-------------------------------------------------------------------------------- +*/ +.OxButton { + border-width: 1px; + border-style: solid; + text-align: center; +} +.OxButton.OxSymbol, +.OxButton.OxSymbol:active, +.OxButton.OxSymbol:focus { + padding: 2px; + border: 1px solid rgba(0, 0, 0, 0); + background: rgba(0, 0, 0, 0); + -moz-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + -o-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + -webkit-box-shadow: 0 0 0 rgba(0, 0, 0, 0); +} +/* +-------------------------------------------------------------------------------- +OxButtonGroup +-------------------------------------------------------------------------------- +*/ +.OxButtonGroup { + display: table-cell; +} +.OxButtonGroup > .OxButton { + border-right-width: 0; + border-radius: 0; +} +.OxButtonGroup > .OxButton:last-child { + border-right-width: 1px; +} +.OxButtonGroup > .OxButton.OxLarge:first-child { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.OxButtonGroup > .OxButton.OxLarge:last-child { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.OxButtonGroup > .OxButton.OxMedium:first-child { + border-top-left-radius: 8px; + border-bottom-left-radius: 8px; +} +.OxButtonGroup > .OxButton.OxMedium:last-child { + border-top-right-radius: 8px; + border-bottom-right-radius: 8px; +} +.OxButtonGroup > .OxButton.OxSmall:first-child { + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; +} +.OxButtonGroup > .OxButton.OxSmall:last-child { + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; +} +.OxButtonGroup > .OxButton.OxTab { + border-top-left-radius: 8px; + border-top-right-radius: 8px; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +.OxButtonGroup > .OxButton.OxTab:first-child { + border-bottom-left-radius: 0; +} +.OxButtonGroup > .OxButton.OxTab:last-child { + border-bottom-right-radius: 0; +} +/* +-------------------------------------------------------------------------------- +OxCheckbox +-------------------------------------------------------------------------------- +*/ +div.OxCheckbox { + height: 16px; + border-radius: 8px; +} +input.OxCheckbox { + border-width: 1px; + border-style: solid; + border-radius: 8px; +} +.OxCheckboxGroup { + display: table-cell; +} +.OxCheckboxGroup.OxGroup > div.OxCheckbox { + float: left; +} +.OxCheckboxGroup.OxGroup > div.OxCheckbox { + //padding-right: 16px; + margin-right: -16px; +} +.OxCheckboxGroup.OxGroup > div.OxCheckbox:last-child { + //padding-right: 0; + margin-right: 0; +} +.OxCheckboxGroup.OxList > div.OxCheckbox { + margin-bottom: 8px; +} +.OxCheckboxGroup.OxList > div.OxCheckbox:last-child { + margin-bottom: 0; +} +/* +-------------------------------------------------------------------------------- +OxFileButton +-------------------------------------------------------------------------------- +*/ +.OxMenu .OxFileButton > .OxButton { + height: 16px; + margin: -1px 0 0 -6px; + border-width: 0; + background: transparent; + text-align: left; +} +/* +-------------------------------------------------------------------------------- +OxFileInput +-------------------------------------------------------------------------------- +*/ +.OxFileInput > .OxBar { + border-width: 1px; + border-style: solid; + border-radius: 8px; +} +.OxFileInput > .OxFiles { + position: absolute; + top: 15px; + border-width: 1px; + border-style: solid; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; +} +.OxFileInput > .OxFiles .OxContent, +.OxFileInput > .OxFiles .OxItem:last-child { + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; +} +/* +-------------------------------------------------------------------------------- +OxForm +-------------------------------------------------------------------------------- +*/ +.OxFormDescription { + margin-bottom: 8px; +} +.OxFormItem { + margin-top: 8px; +} +.OxFormItem:first-child { + margin-top: 0; +} +.OxFormMessage { + //width: 100%; + height: 10px; + margin: 2px 8px 0 0; + text-align: right; + display: none; +} +/* +-------------------------------------------------------------------------------- +OxInput +-------------------------------------------------------------------------------- +*/ + +div.OxInput { + height: 16px; +} +div.OxInput.OxMedium { + height: 16px; +} +div.OxInput.OxRounded { + border-radius: 8px; +} +div.OxInput.OxSquare { + border-radius: 0; +} +div.OxInput > .OxInputLabel { + float: left; + padding: 0 6px 0 6px; + cursor: default; +} +input.OxInput { + border-width: 1px; + border-style: solid; +} +div.OxInput > input.OxInput { + float: left; +} + +/* +-------------------------------------------------------------------------------- +OxEditableContent +-------------------------------------------------------------------------------- +*/ + +.OxEditableContent { + outline: none; + word-wrap: break-word; + -moz-user-select: text; + -o-user-select: text; + -webkit-user-select: text; +} +.OxEditableContent.OxEditing { + white-space: pre; +} + +/* +-------------------------------------------------------------------------------- +OxEditableElement +-------------------------------------------------------------------------------- +*/ + +.OxEditableElement > .OxValue { + //cursor: pointer; + padding: 0 0 0 1px; + word-wrap: break-word; + -moz-user-select: text; + -o-user-select: text; + -webkit-user-select: text; +} +.OxEditableElement div.OxInput { + padding: 0 1px 0 0; +} +.OxEditableElement input.OxInput { + padding: 0 1px 0 0; + //padding: 0; + border: 0; +} +.OxEditableElement textarea.OxInput { + padding: 0 0 0 1px; + border: 0; +} +.OxValue img { + max-width: 100%; + height: auto; +} + +/* +-------------------------------------------------------------------------------- +OxInputGroup +-------------------------------------------------------------------------------- +*/ +.OxInputGroup { + height: 16px; +} +.OxInputGroup > div { + float: left; +} +/* +-------------------------------------------------------------------------------- +OxLabel +-------------------------------------------------------------------------------- +*/ +.OxLabel { + height: 14px; + border-width: 1px; + border-style: solid; + border-radius: 8px; + padding: 0 6px 0 6px; + text-overflow: ellipsis; + cursor: default; + overflow: hidden; + white-space: nowrap; +} +.OxLabel.OxSquare { + padding: 0 3px 0 3px; + border-radius: 0; +} + +/* +-------------------------------------------------------------------------------- +OxObjectInput +-------------------------------------------------------------------------------- +*/ +.OxObjectInput > div { + margin-top: 8px; +} +.OxObjectInput > div:first-child { + margin-top: 0; +} +.OxObjectArrayInput > div { + padding: 8px 0 8px 0; + border-top-width: 1px; + border-top-style: dashed; + border-top-color: rgb(128, 128, 128); +} +.OxObjectArrayInput > div.OxFirst { + padding-top: 0; + border-top-width: 0; +} +.OxObjectArrayInput > div.OxLast { + padding-bottom: 0; +} + +/* +-------------------------------------------------------------------------------- +OxPicker +-------------------------------------------------------------------------------- +*/ +.OxPicker { + position: absolute; + z-index: 13; + border-radius: 0 8px 8px 8px; + -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.75); + -o-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.75); + -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.75); +} +.OxPicker > div:first-child { + background: rgb(240, 240, 240); + border-radius: 0 8px 0 0; +} +.OxPicker > .OxBar { + border-radius: 0 0 8px 8px; +} +.OxPicker > .OxBar > .OxLabel { + float: left; + margin: 4px 0 4px 4px; +} +.OxPicker > .OxBar > .OxButton { + float: right; + margin: 4px 4px 4px 0; +} +/* +-------------------------------------------------------------------------------- +OxRange +-------------------------------------------------------------------------------- +*/ +.OxRange { + height: 16px; +} +.OxRange > .OxArrow { + float: right; +} +.OxRange > .OxArrow:first-child { + float: left; +} +.OxRange > .OxTrack { + float: right; + border-width: 1px; + border-style: solid; + height: 14px; + border-radius: 8px; +} +.OxRange > .OxTrack > div { + float: left; + height: 16px; + padding: 1px; + margin: -1px; +} +.OxRange > .OxTrack > div > img { + float: left; + height: 14px; + -webkit-user-select: none; +} +.OxRange > .OxTrack > div > img.OxFirstChild { + border-top-left-radius: 7px; + border-bottom-left-radius: 7px; +} +.OxRange > .OxTrack > div > img.OxLastChild { + border-top-right-radius: 7px; + border-bottom-right-radius: 7px; +} +.OxRange > .OxTrack > div > img.OxFirstChild.OxLastChild { + margin-left: 7px; + border-radius: 0; +} +.OxRange > .OxTrack > .OxThumb { + float: left; + margin: -1px; + text-align: center; +} +.OxRange > .OxTrack > .OxThumb.OxTransparent { + border: 1px solid white; + background: rgba(255, 255, 255, 0.25); + box-shadow: 0 0 1px white inset; +} +/* +-------------------------------------------------------------------------------- +OxSelect +-------------------------------------------------------------------------------- +*/ +.OxSelect { + height: 14px; + border-width: 1px; + border-style: solid; + border-radius: 8px; +} +.OxSelect.OxRounded.OxSelected { + border-radius: 8px 8px 0 0; +} +.OxSelect.OxSquare { + border-radius: 0; +} +.OxSelect > .OxTitle { + float: left; + height: 14px; + padding-left: 6px; + border-width: 1px; + text-align: left; + text-overflow: ellipsis; + cursor: default; + overflow: hidden; + white-space: nowrap; +} +.OxSelect > .OxButton { + float: right; + margin: -1px; +} +.OxLabelSelect > .OxLabel { + float: left; + margin: -1px; +} +.OxLabelSelect > .OxTitle { + border-left-width: 1px; + border-left-style: solid; + border-top-left-radius: 8px; + border-bottom-left-radius: 8px; +} +.OxLabelSelect.OxRounded.OxSelected { + border-bottom-left-radius: 8px; +} +.OxLabelSelect.OxRounded.OxSelected > .OxTitle { + border-bottom-left-radius: 0; +} + +/* + +*/ +.OxButton.OxOverlapLeft, +.OxxxCheckbox.OxOverlapLeft, +.OxLabel.OxOverlapLeft, +.OxxxSelect.OxOverlapLeft { + padding-left: 20px; + padding-right: 8px; + margin-left: -16px; +} +.OxButton.OxOverlapRight, +.OxxxCheckbox.OxOverlapRight, +.OxLabel.OxOverlapRight, +.OxxxSelect.OxOverlapRight { + padding-left: 8px; + padding-right: 20px; + margin-right: -16px; +} +.OxButton[type=image].OxOverlapLeft { + padding-left: 17px; + padding-right: 3px; +} +.OxButton[type=image].OxOverlapRight { + padding-left: 3px; + padding-right: 17px; +} +.OxButtonGroup.OxOverlapLeft { + padding-left: 16px; + margin-left: -16px; +} +.OxButtonGroup.OxOverlapRight { + padding-right: 16px; + margin-right: -16px; +} +.OxButtonGroup.OxOverlapLeft > .OxButton[type=image].OxOverlapLeft { + padding-left: 18px; + padding-right: 2px; +} +.OxButtonGroup.OxOverlapRight > .OxButton[type=image].OxOverlapRight { + padding-left: 2px; + padding-right: 18px; +} +.OxCheckbox.OxOverlapLeft > .OxInput { + padding-left: 20px; + margin-left: -16px; +} +.OxCheckbox.OxOverlapRight > .OxLabel { + //padding-left: 8px; + padding-right: 20px; + margin-right: -16px; +} +.OxSelect.OxOverlapLeft { + //padding-left: 8px; + padding-left: 16px; + margin-left: -18px; +} +.OxSelect.OxOverlapRight { + //padding-left: 8px; + padding-right: 16px; + margin-right: -18px; +} + +/* +-------------------------------------------------------------------------------- +OxSpreadsheet +-------------------------------------------------------------------------------- +*/ + +.OxSpreadsheet { + border-width: 1px; + border-style: solid; + border-color: rgb(192, 192, 192); +} +.OxSpreadsheet > * { + float: left; +} + +/* +================================================================================ +Grids +================================================================================ +*/ + +.OxGrid { + background-size: 32px 32px; + background-position: 0 0, 16px 16px; +} + +/* +================================================================================ +Images +================================================================================ +*/ + +.OxReflection > img { + -moz-transform: scaleY(-1); + -o-transform: scaleY(-1); + -webkit-transform: scaleY(-1); +} + +/* +================================================================================ +Layers +================================================================================ +*/ + +.OxLayer { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + opacity: 0; + overflow: hidden; + z-index: 10; +} +.OxLayer.OxDialogLayer { + z-index: 10; +} +.OxLayer.OxMenuLayer { + z-index: 11; +} + +/* +================================================================================ +Lists +================================================================================ +*/ + +.OxCustomList > .OxContainer { + position: absolute; + top: 0; + bottom: 0; +} +.OxCustomList .OxPage { + position: absolute; +} + + +.OxIconList.OxBoth { + overflow-x: hidden; +} + +.OxIconList .OxPage { + position: absolute; + left: 0; + right: 0; + margin-left: auto; + margin-right: auto; +} +.OxInfoList .OxPage { + position: absolute; +} + +.OxIconList .OxItem { + float: left; + margin: 2px; + //opacity: 0.9; +} +.OxIconList .OxItem.OxHover, +.OxIconList .OxItem.OxSelected { + //opacity: 1; +} + +.OxIconList .OxItem > div, +.OxInfoList .OxInfoIcon > div { + position: relative; +} + +.OxIconList .OxItem > .OxIcon { + overflow: hidden; +} + +.OxIconList .OxItem > .OxIcon > img, +.OxIconList .OxItem > .OxIcon > .OxVideoPlayer, +.OxInfoList .OxInfoIcon > .OxIcon > img, +.OxInfoList .OxInfoIcon > .OxIcon > .OxVideoPlayer { + position: absolute; + left: 0; + right: 0; + bottom: 0; + margin: auto; + border: 2px solid rgba(0, 0, 0, 0); + cursor: pointer; + border-radius: 4px; +} + +.OxIconList .OxItem > .OxReflection, +.OxIconList .OxInfoIcon > .OxReflection { + overflow: hidden; +} + +.OxIconList .OxItem > .OxReflection > div, +.OxInfoList .OxInfoIcon > .OxReflection > div { + position: absolute; + left: 0; + top: 0; + right: 0; + margin: auto; +} + +.OxIconList .OxItem > .OxReflection > img, +.OxInfoList .OxInfoIcon > .OxReflection > img { + position: absolute; + left: 0; + top: 0; + right: 0; + margin: auto; +} + +.OxIconList .OxItem > .OxText, +.OxInfoList .OxInfoIcon > .OxText { + text-align: center; +} +.OxIconList .OxItem > .OxText > div, +.OxInfoList .OxInfoIcon > .OxText > div { + display: inline-block; + //font-size: 9px; + font-weight: bold; + text-align: center; + padding: 1px 2px; + border: 2px solid rgba(0, 0, 0, 0); + max-width: 124px; + word-wrap: break-word; + cursor: pointer; + border-radius: 4px; + //-moz-user-select: text; + //-webkit-user-select: text; +} +.OxIconList .OxItem > .OxText > div > div, +.OxIconList .OxInfoIcon > .OxText > div > div > div { + //font-size: 9px; + font-weight: bold; + text-align: center; +} + +.OxInfoList .OxInfoIcon { + text-align: center; + //overflow: hidden; +} +.OxInfoList .OxInfoIcon .OxReflection { + overflow: hidden; +} + + +.OxTableList { + top: 0; + bottom: 0; +} + +.OxTableList .OxBar { + //z-index: 10; + //-moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.75); + //-webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.75); +} +.OxTableList .OxHead { + position: absolute; + left: 0; + height: 16px; + overflow: hidden; + white-space: nowrap; +} +.OxTableList .OxHead .OxHeadCell { + float: left; + height: 16px; + overflow: hidden; +} +.OxTableList .OxHead .OxHeadCell:first-child { + padding-left: 2px; +} +.OxTableList .OxHead .OxTitle { + float: left; + height: 14px; + padding: 2px 2px 0 2px; + font-weight: bold; + font-size: 10px; + text-overflow: ellipsis; + //cursor: pointer; + overflow: hidden; + white-space: nowrap; +} +.OxTableList .OxHead .OxTitle img { + display: block; + width: 10px; + height: 10px; + margin: 1px 0 0 -1px; +} +.OxTableList .OxHead .OxHeadCell .OxColumnStatus { + position: absolute; + right: 49px; + top: 2px; + font-size: 9px; + font-weight: normal; +} +.OxTableList .OxHead .OxHeadCell.OxSelected .OxTitle .OxColumnStatus { + right: 64px; +} +.OxTableList .OxHead .OxOrder { + float: left; + width: 10px; + height: 10px; + margin: 3px; + display: none; +} +.OxTableList .OxHead .OxHeadCell.OxSelected .OxOrder { + //cursor: pointer; + display: block; +} +.OxTableList .OxHead .OxResize { + float: left; + width: 5px; + height: 16px; +} +.OxTableList .OxHead .OxResize.OxResizable { + cursor: ew-resize; +} +.OxTableList .OxHead .OxResize div { + float: left; + width: 2px; + height: 16px; +} +.OxTableList .OxHead .OxResize div.OxCenter { + width: 1px; +} +.OxTableList .OxBar .OxSelect { + position: absolute; + height: 16px; + border-width: 0 1px 0 0; + border-style: solid; + font-size: 11px; + text-align: center; + cursor: pointer; + overflow: hidden; + border-radius: 0; +} +.OxTableList .OxBar .OxClear { + position: absolute; + right: 0; + height: 8px; + padding-top: 4px; + padding-bottom: 4px; + border-width: 0 1px 0 0; + border-style: solid; + cursor: pointer; +} + +.OxTableList .OxBody { + float: left; + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; +} +.OxTableList .OxContent { + //width: 100%; +} +.OxTableList .OxItem { + height: 16px; + cursor: default; +} +.OxTableList .OxItem .OxCell { + float: left; + height: 14px; + padding: 1px 4px 1px 4px; + border-right-width: 1px; + border-right-style: solid; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} +.OxTableList .OxItem .OxCell.OxEdit { + height: 16px; + padding: 0; +} +.OxTableList .OxItem .OxCell > img { + display: block; + width: 16px; + height: 16px; + margin: -1px 0 0 -4px; +} +.OxTableList .OxItem .OxSpace { + float: left; + width: 4px; + height: 16px; +} +.OxTableList .OxItem .OxLine { + float: left; + width: 1px; + height: 16px; +} +.OxTableList .OxItem.OxSelected .OxCell.OxClickable { + cursor: pointer; +} +.OxTableList .OxItem.OxSelected .OxCell.OxEditable { + cursor: text; +} +.OxTableList .OxItem.OxSelected.OxDrag .OxCell { + cursor: ns-resize; +} +.OxTableList .OxPage { + position: absolute; +} + +.OxTreeList .OxItem .OxCell { + height: 13px; + padding-top: 2px; + border-right-width: 0; + font-family: Menlo, Monaco, DejaVu Sans Mono, Bitstream Vera Sans Mono, Consolas, Lucida Console, monospace; +} +.OxTreeList .OxItem .OxCell img { + width: 10px; + height: 10px; + padding: 2px; +} + +/* +================================================================================ +Maps +================================================================================ +*/ + +.OxMap { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + overflow: hidden; +} +.OxMap > * { + position: absolute; +} + +.OxMap .OxRange .OxArrow { + border-radius: 0; +} + +.OxMap .OxMapControl, +.OxMap .OxPlaceControl { + position: absolute; + border-width: 2px; + z-index: 1; +} +.OxMap .OxMapControl.OxButton, +.OxMap .OxPlaceControl.OxButton { + width: 10px; + height: 10px; + padding: 1px; +} +.OxMap .OxMapControl.OxLabel, +.OxMap .OxPlaceControl.OxLabel { + height: 12px; + font-size: 10px; +} +.OxMap .OxMapControl.OxMapButtonCenter { + left: 24px; + top: 24px; +} +.OxMap .OxMapControl.OxMapButtonEast { + left: 44px; + top: 24px; +} +.OxMap .OxMapControl.OxMapButtonNorth { + left: 24px; + top: 4px; +} +.OxMap .OxMapControl.OxMapButtonSouth { + left: 24px; + top: 44px; +} +.OxMap .OxMapControl.OxMapButtonWest { + left: 4px; + top: 24px; +} +.OxMap .OxLabel.OxMapControl.OxMapScale { + right: 4px; + bottom: 19px; +} + +.OxMap .OxPlaceControl.OxPlaceFlag { + right: 180px; + top: 4px; + width: 12px; + height: 12px; + border-width: 2px; + border-style: solid; + border-radius: 8px; +} +.OxMap .OxPlaceControl.OxPlaceFlag > img { + width: 12px; + height: 12px; + border-radius: 6px; +} +.OxMap .OxPlaceControl.OxPlaceName { + right: 24px; + top: 4px; + width: 136px; + text-overflow: ellipsis; +} +.OxMap .OxPlaceControl.OxPlaceDeselectButton { + right: 4px; + top: 4px; +} + +.OxFlag { + width: 16px; + height: 16px; + border-radius: 8px; +} +.OxTypeIcon { + border-width: 2px; + border-style: solid; +} + +/* +================================================================================ +Menus +================================================================================ +*/ + +.OxMainMenu { + z-index: 9; + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); + -o-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); +} +.OxMainMenu.OxLarge { + height: 24px; + padding-left: 8px; +} +.OxMainMenu.OxMedium { + height: 20px; + padding-left: 6px; +} +.OxMainMenu.OxSmall { + height: 16px; + padding-left: 4px; +} +.OxMainMenu > .OxTitle { + float: left; + cursor: default; + -moz-user-select: none; + -o-user-select: none; + -webkit-user-select: none; +} +.OxMainMenu.OxLarge > .OxTitle { + height: 21px; + padding-left: 8px; + padding-right: 8px; + padding-top: 3px; + font-size: 14px; +} +.OxMainMenu.OxMedium > .OxTitle { + height: 17px; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + font-size: 11px; +} +.OxMainMenu.OxSmall > .OxTitle { + height: 14px; + padding-left: 4px; + padding-right: 4px; + padding-top: 2px; + font-size: 9px; +} +.OxMainMenu > .OxTitle:first-child { + font-weight: bold; +} +.OxMainMenu.OxLarge > .OxExtras { + float: right; + padding: 4px 12px 0 0; +} +.OxMainMenu.OxMedium > .OxExtras { + float: right; + padding: 2px 10px 0 0; +} +.OxMainMenu.OxSmall > .OxExtras { + float: right; + padding: 2px 8px 0 0; +} + +.OxMenu { + position: absolute; + display: none; + z-index: 12; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + -moz-user-select: none; + -o-user-select: none; + -webkit-user-select: none; +} +.OxMenu.OxRight { + border-top-right-radius: 4px; +} +.OxMenu .OxTop { + height: 4px; +} +.OxMenu.OxRight .OxTop { + border-top-right-radius: 4px; +} +.OxMenu .OxBottom { + height: 4px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} +.OxMenu .OxContainer { + background: transparent; + overflow: hidden; +} +.OxMenu .OxContent { + position: relative; + border-collapse: collapse; + border-spacing: 0; +} +.OxMenu .OxItem { + cursor: default; +} +.OxMenu.OxLarge .OxItem { + height: 20px; +} +.OxMenu.OxMedium .OxItem { + height: 16px; +} +.OxMenu.OxSmall .OxItem { + height: 12px; +} +.OxMenu .OxItem.OxDisabled { + cursor: default; +} +.OxMenu.OxLarge .OxItem .OxCell { + height: 20px; + font-size: 14px; +} +.OxMenu.OxMedium .OxItem .OxCell { + height: 16px; + font-size: 11px; +} +.OxMenu.OxSmall .OxItem .OxCell { + height: 12px; + font-size: 9px; +} +.OxMenu .OxItem .OxCell.OxStatus { + padding-left: 4px; + text-align: right; +} +.OxMenu .OxItem .OxCell.OxIcon { + padding-left: 4px; +} +.OxMenu .OxItem .OxCell.OxIcon img { + position: relative; + top: 2px; +} +.OxMenu.OxLarge .OxItem .OxCell.OxIcon img { + width: 16px; + height: 16px; + border-radius: 2px; +} +.OxMenu.OxMedium .OxItem .OxCell.OxIcon img { + width: 12px; + height: 12px; + border-radius: 2px; +} +.OxMenu.OxSmall .OxItem .OxCell.OxIcon img { + width: 8px; + height: 8px; + border-radius: 1px; +} +.OxMenu .OxItem .OxCell.OxTitle { + padding-left: 4px; + white-space: nowrap; +} +.OxMenu .OxItem .OxCell.OxModifiers { + padding-left: 4px; + text-align: right; +} +.OxMenu .OxItem .OxCell.OxKey { + padding-right: 8px; +} +.OxMenu .OxItem .OxCell.OxSubmenu { + height: 13px; + padding-top: 3px; + padding-right: 8px; + text-align: right; +} +.OxMenu.OxLarge .OxItem .OxCell.OxSubmenu { + font-size: 10px; +} +.OxMenu.OxMedium .OxItem .OxCell.OxSubmenu { + font-size: 8px; +} +.OxMenu.OxSmall .OxItem .OxCell.OxSubmenu { + font-size: 6px; +} +.OxMenu.OxLarge .OxItem .OxCell.OxStatus, +.OxMenu.OxLarge .OxItem .OxCell.OxKey, +.OxMenu.OxLarge .OxItem .OxCell.OxSubmenu { + width: 12px; +} +.OxMenu.OxMedium .OxItem .OxCell.OxStatus, +.OxMenu.OxMedium .OxItem .OxCell.OxKey, +.OxMenu.OxMedium .OxItem .OxCell.OxSubmenu { + width: 10px; +} +.OxMenu.OxSmall .OxItem .OxCell.OxStatus, +.OxMenu.OxSmall .OxItem .OxCell.OxKey, +.OxMenu.OxSmall .OxItem .OxCell.OxSubmenu { + width: 8px; +} +.OxMenu .OxSpace { + height: 4px; +} +.OxMenu .OxLine { + height: 1px; +} +.OxMenu .OxScrollbar { + text-align: center; + cursor: default; + display: none; +} +.OxMenu.OxLarge .OxScrollbar { + height: 16px; + padding-top: 4px; + font-size: 10px; +} +.OxMenu.OxMedium .OxScrollbar { + height: 13px; + padding-top: 3px; + font-size: 8px; +} +.OxMenu.OxSmall .OxScrollbar { + height: 10px; + padding-top: 2px; + font-size: 6px; +} + +/* +================================================================================ +Panels +================================================================================ +*/ + +.OxCollapsePanel > .OxBar { + position: relative; + z-index: 1; +} +.OxCollapsePanel > .OxBar > .OxButton { + float: left; + margin: 0 0 0 0; +} +.OxCollapsePanel > .OxBar > .OxTitle { + float: left; + margin: 1px 0 0 0; + font-weight: bold; +} +.OxCollapsePanel > .OxBar > .OxExtras { + float: right; +} +.OxCollapsePanel > .OxBar > .OxExtras > * { + float: left; +} +.OxCollapsePanel > .OxBar > .OxExtras > .OxButton, +.OxCollapsePanel > .OxBar > .OxExtras > .OxButton:active, +.OxCollapsePanel > .OxBar > .OxExtras > .OxButton:focus { + padding: 3px; + border-width: 0; +} +.OxCollapsePanel > .OxBar > .OxExtras > input.OxMedium { + border-radius: 0; +} +.OxCollapsePanel > .OxBar > .OxExtras > .OxSelect { + width: 14px; + height: 14px; + padding: 1px; + border-width: 0; + border-radius: 0; + background: rgba(0, 0, 0, 0); +} +.OxCollapsePanel > .OxBar > .OxExtras > .OxSelect.OxFocus { + -moz-box-shadow: 0 0 0; + -o-box-shadow: 0 0 0; + -webkit-box-shadow: 0 0 0; +} + + +.OxCollapsePanel > .OxContent { + position: relative; + left: 0; + right: 0; +} + +.OxPanel { + overflow: auto; +} + +.OxSlidePanel { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + overflow: hidden; +} +.OxSlidePanel > div { + position: absolute; +} + +.OxSplitPanel { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + overflow: hidden; +} +.OxSplitPanel > * { + position: absolute; +} + +.OxSplitPanel_ { + display: box; + display: -moz-box; + display: -o-box; + display: -webkit-box; + overflow: hidden; + box-flex: 0; + -mox-box-flex: 0; + -webkit-box-flex: 0; +} +.OxSplitPanel_.OxHorizontal { + box-orient: horizontal; + -moz-box-orient: horizontal; + -o-box-orient: horizontal; + -webkit-box-orient: horizontal; +} +.OxSplitPanel_.OxVertical { + box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-box-orient: vertical; +} +.OxSplitPanel_ > * { + box-flex: 0; + -mox-box-flex: 0; + -webkit-box-flex: 0; +} +.OxSplitPanel_ > .OxSeparator { + display: -webkit-box; + position: relative; + z-index: 2; +} +.OxSplitPanel_ > .OxSeparator > * { + -webkit-box-flex: 0; +} +.OxSplitPanel_ > .OxSeparator > .OxLine { + background-color: black; +} +.OxSplitPanel_.OxHorizontal > .OxSeparator { + width: 5px; + margin: 0 -2px 0 -2px; + cursor: ew-resize; +} +.OxSplitPanel_.OxHorizontal > .OxSeparator > .OxLine { + width: 1px; +} +.OxSplitPanel_.OxHorizontal > .OxSeparator > .OxSpace { + width: 2px; +} +.OxSplitPanel_.OxVertical > .OxSeparator { + height: 5px; + margin: -2px 0 -2px 0; + cursor: ns-resize; +} +.OxSplitPanel_.OxVertical > .OxSeparator > .OxLine { + height: 1px; +} +.OxSplitPanel_.OxVertical > .OxSeparator > .OxSpace { + height: 2px; +} + +.OxTabPanel > .OxBar { + text-align: center; +} +.OxTabPanel > .OxBar > .OxButtonGroup { + position: absolute; + left: 0; + right: 0; + margin: auto; +} + +/* +================================================================================ +Requests +================================================================================ +*/ + +.OxLoadingIcon { + opacity: 0; + -moz-user-select: none; + -o-user-select: none; + -webkit-user-select: none; +} + +.OxLoadingIcon.OxLarge { + width: 20px; + height: 20px; +} +.OxLoadingIcon.OxMedium { + width: 16px; + height: 16px; +} +.OxLoadingIcon.OxSmall { + width: 12px; + height: 12px; +} + +/* +================================================================================ +Scrollbars +================================================================================ +*/ + +::-webkit-scrollbar { + width: 8px; + height: 8px; +} +::-webkit-scrollbar-button { + width: 8px; + height: 8px; +} +::-webkit-scrollbar-thumb { + border-radius: 8px; +} +::-webkit-scrollbar-track { + border-radius: 8px; +} + +/* +================================================================================ +SourceViewer +================================================================================ +*/ + +.OxSourceViewer table { + border-collapse: collapse; +} +.OxSourceViewer td { + vertical-align: top; +} +.OxSourceViewer td.OxComment { + padding: 4px 8px 4px 8px; + border-right-width: 1px; + border-right-style: solid; + font-size: 14px; + line-height: 20px; + -moz-user-select: text; + -webkit-user-select: text; +} +.OxSourceViewer td.OxComment > code { + padding: 1px 3px 1px 3px; + border-radius: 2px; + font-family: Menlo, Monaco, DejaVu Sans Mono, Bitstream Vera Sans Mono, Consolas, Lucida Console, monospace; + font-size: 11px; + line-height: 14px; +} +.OxSourceViewer td.OxComment > pre { + line-height: 16px; + margin: 4px 0 4px 0; + font-family: Menlo, Monaco, DejaVu Sans Mono, Bitstream Vera Sans Mono, Consolas, Lucida Console, monospace; + font-size: 11px; +} +.OxSourceViewer td.OxComment > pre > code { + padding: 0; +} + +/* +================================================================================ +SyntaxHightlighter +================================================================================ +*/ + +.OxSyntaxHighlighter > div { + display: table-cell; + padding: 4px; + font-family: Menlo, Monaco, DejaVu Sans Mono, Lucida Console, Consolas, Bitstream Vera Sans Mono, monospace; + line-height: 16px; +} +.OxSyntaxHighlighter > .OxLineNumbers { + text-align: right; + -moz-user-select: none; + -o-user-select: none; + -webkit-user-select: none; +} +.OxSyntaxHighlighter > .OxSourceCode { + white-space: nowrap; + -moz-user-select: text; + -o-user-select: text; + -webkit-user-select: text; +} +.OxSyntaxHighlighter > .OxSourceCode .OxLinebreak { + //-moz-user-select: none; + //-webkit-user-select: none; +} + +/* +================================================================================ +Video +================================================================================ +*/ + +.OxAnnotation { + border-width: 0 0 1px 0; + border-style: solid; + //padding: 4px 4px 0 4px; +} +.OxAnnotation:last-child { + border-width: 0; +} +/* +.OxAnnotation.OxEdit { + padding: 0; +} +.OxAnnotation textarea { + padding: 4px; + border: 0; +} +*/ + +.OxPosterMarker { + position: absolute; + display: none; +} +.OxPosterMarkerCenter { + position: absolute; + border: 1px solid rgba(255, 255, 255, 0.1); + background: transparent; +} +.OxPosterMarkerLeft, +.OxPosterMarkerRight { + position: absolute; + background: rgba(0, 0, 0, 0.5); +} + +.OxVideoEditor { + overflow-x: hidden; + overflow-y: auto; +} +.OxVideoEditor .OxVideoPlayer { + position: absolute; + margin: 4px; + //background: red; +} + + +.OxLargeVideoTimeline { + position: absolute; + height: 72px; + margin: 0 4px 0 4px; + overflow: hidden; +} +.OxLargeVideoTimeline > div { + position: absolute; + height: 72px; +} +.OxLargeVideoTimeline > div > img { + position: absolute; + top: 4px; +} +.OxLargeVideoTimeline .OxCut { + position: absolute; + top: 62px; + width: 8px; + height: 8px; + margin-left: -4px; + z-index: 7; +} +.OxLargeVideoTimeline .OxMarkerPointIn { + position: absolute; + top: 63px; + width: 7px; + height: 7px; + margin-left: -6px; + z-index: 9; +} +.OxLargeVideoTimeline .OxMarkerPointOut { + position: absolute; + top: 63px; + width: 7px; + height: 7px; + z-index: 9; +} +.OxLargeVideoTimeline .OxMarkerPosition { + position: absolute; + top: 2px; + width: 11px; + height: 11px; + margin-left: -5px; + z-index: 9; +} +.OxLargeVideoTimeline .OxOverlay { + position: absolute; + height: 72px; + z-index: 8; +} +.OxLargeVideoTimeline .OxSubtitle { + position: absolute; + bottom: 9px; + max-height: 50px; + border: 1px solid rgba(255, 255, 255, 0.5); + padding: 1px; + background: rgba(0, 0, 0, 0.25); + font-size: 8px; + line-height: 10px; + text-align: center; + text-overflow: ellipsis; + text-shadow: rgba(0, 0, 0, 1) 1px 1px 1px; + color: rgb(255, 255, 255); + cursor: default; + overflow: hidden; + z-index: 7; + -moz-box-shadow: 0 0 2px rgba(0, 0, 0, 0.5); + -o-box-shadow: 0 0 2px rgba(0, 0, 0, 0.5); + -webkit-box-shadow: 0 0 2px rgba(0, 0, 0, 0.5); +} +.OxLargeVideoTimeline .OxSubtitle.OxHighlight { + border-color: rgb(255, 255, 0); +} +.OxTimelineSmall { + position: absolute; +} +.OxTimelineSmall > div { + position: absolute; + height: 18px; + margin: 3px 4px 3px 4px; + overflow: hidden; +} +.OxTimelineSmall > div > img { + position: absolute; + left: 0; + top: 0; +} +.OxTimelineSmall > div > .OxTimelineSmallImage { + margin-top: 1px; +} + +.OxSmallVideoTimeline .OxInterface, +.OxBlockVideoTimeline .OxInterface { + position: absolute; + z-index: 9; +} +.OxSmallVideoTimeline .OxMarkerPlay { + position: absolute; + width: 14px; + height: 14px; + border-width: 1px; + border-style: solid; + border-radius: 8px; +} +.OxSmallVideoTimeline .OxMarkerPlay > div { + width: 10px; + height: 10px; + border-width: 2px; + border-style: solid; + border-radius: 7px; +} +.OxSmallVideoTimeline .OxMarkerPlay > div > div { + width: 8px; + height: 8px; + border-width: 1px; + border-style: solid; + border-radius: 5px; +} +.OxSmallVideoTimeline .OxMarkerPointIn, +.OxBlockVideoTimeline .OxMarkerPointIn { + position: absolute; + width: 7px; + height: 7px; + margin-left: -2px; + z-index: 8; +} +.OxSmallVideoTimeline .OxMarkerPointIn { + top: 15px; +} +.OxSmallVideoTimeline .OxMarkerPointOut, +.OxBlockVideoTimeline .OxMarkerPointOut { + position: absolute; + width: 7px; + height: 7px; + margin-left: 4px; + z-index: 8; +} +.OxSmallVideoTimeline .OxMarkerPointOut { + top: 15px; +} +.OxSmallVideoTimeline .OxMarkerPosition, +.OxBlockVideoTimeline .OxMarkerPosition { + position: absolute; + width: 11px; + height: 11px; + z-index: 8; +} +.OxSmallVideoTimeline .OxMarkerPosition { + top: 2px; +} + + +.OxVideoPlayer { + position: absolute; +} +.OxVideoPlayer.OxFocus { + -moz-box-shadow: 0 0 2px rgb(128, 128, 128); + -o-box-shadow: 0 0 2px rgb(128, 128, 128); + -webkit-box-shadow: 0 0 2px rgb(128, 128, 128); +} + +.OxVideoPlayer .OxBar.OxControls > * { + float: left; +} +.OxVideoPlayer .OxControls { + position: absolute; +} + +.OxVideoPlayer .OxFind { + position: absolute; + right: 0; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + display: none; +} +.OxVideoPlayer .OxFind > * { + float: left; +} +.OxVideoPlayer .OxFind .OxResults { + width: 24px; + padding-top: 2px; + font-size: 9px; + text-align: center; +} + +.OxVideoPlayer .OxInput { + background: transparent; + -moz-box-shadow: 0 0 0; + -o-box-shadow: 0 0 0; + -webkit-box-shadow: 0 0 0; +} +.OxVideoPlayer div.OxInput.OxFocus { + -moz-box-shadow: 0 0 0; + -o-box-shadow: 0 0 0; + -webkit-box-shadow: 0 0 0; +} +.OxVideoPlayer input.OxInput { + height: 16px; + //padding: 0 4px 0 4px; + border: 0; + border-radius: 8px; +} +.OxVideoPlayer .OxPositionInput > input.OxInput { + padding: 0 3px 0 3px; +} + +.OxVideoPlayer .OxSelect { + width: 16px; + height: 16px; + border-width: 0; + border-radius: 0; + background: rgba(0, 0, 0, 0); +} +.OxVideoPlayer .OxSelect > .OxButton { + margin: 0; +} + + +.OxVideoPlayer .OxCensoredIcon { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + margin: auto; +} + +.OxVideoPlayer .OxLoadingIcon { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + margin: auto; + opacity: 1; +} + +.OxVideoPlayer .OxLogo { + position: absolute; + opacity: 0.25; +} + +.OxVideoPlayer .OxPlayIcon { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + margin: auto; + border: 2px solid rgb(255, 255, 255); + background: rgba(0, 0, 0, 0.5); + opacity: 0; +} + +.OxVideoPlayer .OxPointMarker { + display: none; + position: absolute; + width: 16px; + height: 16px; + opacity: 0.5; +} +.OxVideoPlayer .OxPointMarkerInTop { + left: 4px; + top: 4px; +} +.OxVideoPlayer .OxPointMarkerInBottom { + left: 4px; + bottom: 4px; +} +.OxVideoPlayer .OxPointMarkerOutTop { + right: 4px; + top: 4px; +} +.OxVideoPlayer .OxPointMarkerOutBottom { + right: 4px; + bottom: 4px; +} + +.OxVideoPlayer .OxPosition { + height: 12px; + padding: 2px; + font-size: 9px; + text-align: center; +} + +.OxVideoPlayer .OxPositionInput { + display: none; +} + +.OxVideoPlayer .OxPoster { + position: absolute; +} + +.OxVideoPlayer .OxSettings { + position: absolute; + right: 0; + bottom: 16px; + display: none; +} +.OxVideoPlayer .OxSettings > div { + width: 72px; +} +.OxVideoPlayer .OxSettings > .OxItem { + height: 16px; +} +.OxVideoPlayer .OxSettings > .OxItem:first-child { + border-top-left-radius: 8px; + border-top-right-radius: 8px; +} +.OxVideoPlayer .OxSettings > .OxItem > * { + float: left; +} +.OxVideoPlayer .OxSettings > .OxItem > div { + width: 56px; + height: 14px; + padding-top: 2px; + font-size: 9px; + text-align: right; + cursor: default; +} +.OxVideoPlayer .OxSettings > .OxItem > img { + width: 9px; + height: 9px; + padding: 3px 3px 4px 4px; +} +.OxVideoPlayer .OxSettings > .OxLine { + height: 1px; +} +.OxVideoPlayer .OxSettings > .OxSpace { + height: 0; +} + +.OxVideoPlayer .OxSubtitle { + position: absolute; + left: 0; + right: 0; + text-align: center; + text-shadow: rgba(0, 0, 0, 1) 0 0 4px; + color: rgb(255, 255, 255); +} + +.OxVideoPlayer .OxTitle { + padding-top: 1px; + text-align: center; + overflow: hidden; + text-overflow: ellipsis; +} + +.OxVideoPlayer .OxVideoContainer { + position: absolute; + background: rgb(0, 0, 0); + overflow: hidden; +} + +.OxVideoPlayer .OxVolume { + position: absolute; + left: 0; + height: 16px; + border-top-left-radius: 8px; + border-top-right-radius: 8px; + display: none; +} +.OxVideoPlayer .OxVolume > * { + float: left; +} +.OxVideoPlayer .OxVolume .OxRange .OxTrack { + padding: 1px; + border: 0; +} +.OxVideoPlayer .OxVolume .OxRange .OxThumb { + padding: 1px 7px 1px 7px; + border: 0; +} +.OxVideoPlayer .OxVolume .OxVolumeValue { + width: 24px; + padding-top: 2px; + font-size: 9px; + text-align: center; +} + + + +.OxVideoPlayer .OxInput { + background-color: transparent; + background-image: none; + -moz-box-shadow: 0 0 0; + -o-box-shadow: 0 0 0; + -webkit-box-shadow: 0 0 0; +} +.OxVideoPlayer div.OxInput.OxFocus { + -moz-box-shadow: 0 0 0; + -o-box-shadow: 0 0 0; + -webkit-box-shadow: 0 0 0; +} + + +.OxVideoTimelinePlayer .OxPosition { + float: left; + height: 12px; + padding: 2px; + font-size: 9px; + text-align: center; +} +.OxVideoTimelinePlayer .OxPositionInput { + float: left; + display: none; +} +.OxVideoTimelinePlayer div.OxPositionInput { + background: transparent; + -moz-box-shadow: 0 0 0; + -o-box-shadow: 0 0 0; + -webkit-box-shadow: 0 0 0; +} +.OxVideoTimelinePlayer div.OxPositionInput.OxFocus { + -moz-box-shadow: 0 0 0; + -o-box-shadow: 0 0 0; + -webkit-box-shadow: 0 0 0; +} +.OxVideoTimelinePlayer .OxPositionInput > input.OxInput { + height: 16px; + padding: 0 3px 0 3px; + border: 0; + border-radius: 8px; +} +.OxVideoTimelinePlayer .OxSelect { + width: 16px; + height: 16px; + border-width: 0; + border-radius: 0; + background: rgba(0, 0, 0, 0); +} +.OxVideoTimelinePlayer .OxSelect > .OxButton { + margin: 0; +} +.OxVideoTimelinePlayer .OxVideoBox { + border-top-width: 1px; + border-top-style: solid; + border-bottom-width: 1px; + border-bottom-style: solid; + background: rgb(0, 0, 0); +} + + + +.OxVideoPreview { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; +} +.OxVideoPreview > .OxFrame { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 16px; + overflow: hidden; +} +.OxVideoPreview > OxFrame > img { + position: absolute; +} +.OxVideoPreview > .OxTimeline { + position: absolute; + bottom: 0; + height: 16px; +} +.OxVideoPreview > .OxInterface { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + cursor: pointer; +} + +/* +================================================================================ +Miscellaneous +================================================================================ +*/ + +.OxColor { + border-radius: 8px; + padding: 0 4px 1px 4px; + overflow: hidden; + text-overflow: ellipsis; +} +.OxLabel.OxColor, .OxSelect.OxColor { + padding: 0; +} + +.OxLoadingScreen { + position: absolute; +} +.OxLoadingScreen > div { + position: absolute; + text-align: center; +} +.OxLoadingScreen > div > div { + margin-top: 4px; +} +.OxLoadingScreen.OxAuto { + left: 0; + top: 0; + right: 0; + bottom: 0; +} +.OxLoadingScreen.OxAuto > div { + left: 0; + top: 0; + right: 0; + bottom: 0; + margin: auto; +} + +.OxSpecialLink { + padding: 0 2px 0 2px; + border-radius: 2px; +} +.OxSpecialLink:hover { + text-decoration: none; +} + +.OxTextPage { + line-height: 16px; +} + +.OxTooltip { + position: absolute; + padding: 1px 3px 1px 3px; + border-radius: 4px; + font-size: 9px; + //opacity: 0; + white-space: nowrap; + z-index: 1001; +} +.OxTooltip > div { + font-size: 9px; +} diff --git a/demo/static/OxJS/dev/Ox.UI/jquery/jquery.js b/demo/static/OxJS/dev/Ox.UI/jquery/jquery.js new file mode 100644 index 0000000..e6a95c6 --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/jquery/jquery.js @@ -0,0 +1,9266 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Matches dashed string for camelizing + rdashAlpha = /-([a-z]|[0-9])/ig, + rmsPrefix = /^-ms-/, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = ( context ? context.ownerDocument || context : document ); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.7.1", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.add( fn ); + + return this; + }, + + eq: function( i ) { + i = +i; + return i === -1 ? + this.slice( i ) : + this.slice( i, i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.fireWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).off( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery.Callbacks( "once memory" ); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array, i ) { + var len; + + if ( array ) { + if ( indexOf ) { + return indexOf.call( array, elem, i ); + } + + len = array.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in array && array[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can optionally be executed if it's a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return ( new Date() ).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +return jQuery; + +})(); + + +// String to Object flags format cache +var flagsCache = {}; + +// Convert String-formatted flags into Object-formatted ones and store in cache +function createFlags( flags ) { + var object = flagsCache[ flags ] = {}, + i, length; + flags = flags.split( /\s+/ ); + for ( i = 0, length = flags.length; i < length; i++ ) { + object[ flags[i] ] = true; + } + return object; +} + +/* + * Create a callback list using the following parameters: + * + * flags: an optional list of space-separated flags that will change how + * the callback list behaves + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible flags: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( flags ) { + + // Convert flags from String-formatted to Object-formatted + // (we check in cache first) + flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; + + var // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = [], + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Add one or several callbacks to the list + add = function( args ) { + var i, + length, + elem, + type, + actual; + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + // Inspect recursively + add( elem ); + } else if ( type === "function" ) { + // Add if not in unique mode and callback is not in + if ( !flags.unique || !self.has( elem ) ) { + list.push( elem ); + } + } + } + }, + // Fire callbacks + fire = function( context, args ) { + args = args || []; + memory = !flags.memory || [ context, args ]; + firing = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { + memory = true; // Mark as halted + break; + } + } + firing = false; + if ( list ) { + if ( !flags.once ) { + if ( stack && stack.length ) { + memory = stack.shift(); + self.fireWith( memory[ 0 ], memory[ 1 ] ); + } + } else if ( memory === true ) { + self.disable(); + } else { + list = []; + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + var length = list.length; + add( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away, unless previous + // firing was halted (stopOnFalse) + } else if ( memory && memory !== true ) { + firingStart = length; + fire( memory[ 0 ], memory[ 1 ] ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + var args = arguments, + argIndex = 0, + argLength = args.length; + for ( ; argIndex < argLength ; argIndex++ ) { + for ( var i = 0; i < list.length; i++ ) { + if ( args[ argIndex ] === list[ i ] ) { + // Handle firingIndex and firingLength + if ( firing ) { + if ( i <= firingLength ) { + firingLength--; + if ( i <= firingIndex ) { + firingIndex--; + } + } + } + // Remove the element + list.splice( i--, 1 ); + // If we have some unicity property then + // we only need to do this once + if ( flags.unique ) { + break; + } + } + } + } + } + return this; + }, + // Control if a given callback is in the list + has: function( fn ) { + if ( list ) { + var i = 0, + length = list.length; + for ( ; i < length; i++ ) { + if ( fn === list[ i ] ) { + return true; + } + } + } + return false; + }, + // Remove all callbacks from the list + empty: function() { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory || memory === true ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( stack ) { + if ( firing ) { + if ( !flags.once ) { + stack.push( [ context, args ] ); + } + } else if ( !( flags.once && memory ) ) { + fire( context, args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!memory; + } + }; + + return self; +}; + + + + +var // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + + Deferred: function( func ) { + var doneList = jQuery.Callbacks( "once memory" ), + failList = jQuery.Callbacks( "once memory" ), + progressList = jQuery.Callbacks( "memory" ), + state = "pending", + lists = { + resolve: doneList, + reject: failList, + notify: progressList + }, + promise = { + done: doneList.add, + fail: failList.add, + progress: progressList.add, + + state: function() { + return state; + }, + + // Deprecated + isResolved: doneList.fired, + isRejected: failList.fired, + + then: function( doneCallbacks, failCallbacks, progressCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); + return this; + }, + always: function() { + deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); + return this; + }, + pipe: function( fnDone, fnFail, fnProgress ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ], + progress: [ fnProgress, "notify" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + obj = promise; + } else { + for ( var key in promise ) { + obj[ key ] = promise[ key ]; + } + } + return obj; + } + }, + deferred = promise.promise({}), + key; + + for ( key in lists ) { + deferred[ key ] = lists[ key ].fire; + deferred[ key + "With" ] = lists[ key ].fireWith; + } + + // Handle state + deferred.done( function() { + state = "resolved"; + }, failList.disable, progressList.lock ).fail( function() { + state = "rejected"; + }, doneList.disable, progressList.lock ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = sliceDeferred.call( arguments, 0 ), + i = 0, + length = args.length, + pValues = new Array( length ), + count = length, + pCount = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(), + promise = deferred.promise(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( deferred, args ); + } + }; + } + function progressFunc( i ) { + return function( value ) { + pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + deferred.notifyWith( promise, pValues ); + }; + } + if ( length > 1 ) { + for ( ; i < length; i++ ) { + if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return promise; + } +}); + + + + +jQuery.support = (function() { + + var support, + all, + a, + select, + opt, + input, + marginDiv, + fragment, + tds, + events, + eventName, + i, + isSupported, + div = document.createElement( "div" ), + documentElement = document.documentElement; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = "
a"; + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute("href") === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Tests for enctype support on a form(#6743) + enctype: !!document.createElement("form").enctype, + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains its value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.lastChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + fragment.removeChild( input ); + fragment.appendChild( div ); + + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( window.getComputedStyle ) { + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.style.width = "2px"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + // Technique from Juriy Zaytsev + // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for( i in { + submit: 1, + change: 1, + focusin: 1 + }) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + fragment.removeChild( div ); + + // Null elements to avoid leaks in IE + fragment = select = opt = marginDiv = div = input = null; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, outer, inner, table, td, offsetSupport, + conMarginTop, ptlm, vb, style, html, + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + conMarginTop = 1; + ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;"; + vb = "visibility:hidden;border:0;"; + style = "style='" + ptlm + "border:5px solid #000;padding:0;'"; + html = "
" + + "" + + "
"; + + container = document.createElement("div"); + container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; + body.insertBefore( container, body.firstChild ); + + // Construct the test element + div = document.createElement("div"); + container.appendChild( div ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + div.innerHTML = "
t
"; + tds = div.getElementsByTagName( "td" ); + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE <= 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Figure out if the W3C box model works as expected + div.innerHTML = ""; + div.style.width = div.style.paddingLeft = "1px"; + jQuery.boxModel = support.boxModel = div.offsetWidth === 2; + + if ( typeof div.style.zoom !== "undefined" ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); + } + + div.style.cssText = ptlm + vb; + div.innerHTML = html; + + outer = div.firstChild; + inner = outer.firstChild; + td = outer.nextSibling.firstChild.firstChild; + + offsetSupport = { + doesNotAddBorder: ( inner.offsetTop !== 5 ), + doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) + }; + + inner.style.position = "fixed"; + inner.style.top = "20px"; + + // safari subtracts parent border width here which is 5px + offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); + inner.style.position = inner.style.top = ""; + + outer.style.overflow = "hidden"; + outer.style.position = "relative"; + + offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); + offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); + + body.removeChild( container ); + div = container = null; + + jQuery.extend( support, offsetSupport ); + }); + + return support; +})(); + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var privateCache, thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, + isEvents = name === "events"; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ internalKey ] = id = ++jQuery.uuid; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + privateCache = thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Users should not attempt to inspect the internal events object using jQuery.data, + // it is undocumented and subject to change. But does anyone listen? No. + if ( isEvents && !thisCache[ name ] ) { + return privateCache.events; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, l, + + // Reference to internal data cache key + internalKey = jQuery.expando, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ internalKey ] : internalKey; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } + + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + // Ensure that `cache` is not a window object #10080 + if ( jQuery.support.deleteExpando || !cache.setInterval ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the cache and need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ internalKey ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( internalKey ); + } else { + elem[ internalKey ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var parts, attr, name, + data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { + attr = this[0].attributes; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( this[0], name, data[ name ] ); + } + } + jQuery._data( this[0], "parsedAttrs", true ); + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var self = jQuery( this ), + args = [ parts[0], value ]; + + self.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + self.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + jQuery.isNumeric( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery._data( elem, deferDataKey ); + if ( defer && + ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && + ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery._data( elem, queueDataKey ) && + !jQuery._data( elem, markDataKey ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.fire(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = ( type || "fx" ) + "mark"; + jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); + if ( count ) { + jQuery._data( elem, key, count ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + var q; + if ( elem ) { + type = ( type || "fx" ) + "queue"; + q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + hooks = {}; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + jQuery._data( elem, type + ".run", hooks ); + fn.call( elem, function() { + jQuery.dequeue( elem, type ); + }, hooks ); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue " + type + ".run", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { + count++; + tmp.add( resolve ); + } + } + resolve(); + return defer.promise(); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + nodeHook, boolHook, fixSpecified; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.prop ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classNames, i, l, elem, className, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + classNames = ( value || "" ).split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + className = (" " + elem.className + " ").replace( rclass, " " ); + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[ c ] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, i, max, option, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + i = one ? index : 0; + max = one ? index + 1 : options.length; + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( notxml ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var propName, attrNames, name, l, + i = 0; + + if ( value && elem.nodeType === 1 ) { + attrNames = value.toLowerCase().split( rspace ); + l = attrNames.length; + + for ( ; i < l; i++ ) { + name = attrNames[ i ]; + + if ( name ) { + propName = jQuery.propFix[ name ] || name; + + // See #9699 for explanation of this approach (setting first, then removal) + jQuery.attr( elem, name, "" ); + elem.removeAttribute( getSetAttribute ? name : propName ); + + // Set corresponding property to false for boolean attributes + if ( rboolean.test( name ) && propName in elem ) { + elem[ propName ] = false; + } + } + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return ( elem[ name ] = value ); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) +jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode, + property = jQuery.prop( elem, name ); + return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + fixSpecified = { + name: true, + id: true + }; + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return ( ret.nodeValue = value + "" ); + } + }; + + // Apply the nodeHook to tabindex + jQuery.attrHooks.tabindex.set = nodeHook.set; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function( elem, value, name ) { + if ( value === "" ) { + value = "false"; + } + nodeHook.set( elem, value, name ); + } + }; +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = "" + value ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }); +}); + + + + +var rformElems = /^(?:textarea|input|select)$/i, + rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, + rhoverHack = /\bhover(\.\S+)?\b/, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, + quickParse = function( selector ) { + var quick = rquickIs.exec( selector ); + if ( quick ) { + // 0 1 2 3 + // [ _, tag, id, class ] + quick[1] = ( quick[1] || "" ).toLowerCase(); + quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); + } + return quick; + }, + quickIs = function( elem, m ) { + var attrs = elem.attributes || {}; + return ( + (!m[1] || elem.nodeName.toLowerCase() === m[1]) && + (!m[2] || (attrs.id || {}).value === m[2]) && + (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) + ); + }, + hoverHack = function( events ) { + return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); + }; + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + add: function( elem, types, handler, data, selector ) { + + var elemData, eventHandle, events, + t, tns, type, namespaces, handleObj, + handleObjIn, quick, handlers, special; + + // Don't attach events to noData or text/comment nodes (allow plain objects tho) + if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + events = elemData.events; + if ( !events ) { + elemData.events = events = {}; + } + eventHandle = elemData.handle; + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = jQuery.trim( hoverHack(types) ).split( " " ); + for ( t = 0; t < types.length; t++ ) { + + tns = rtypenamespace.exec( types[t] ) || []; + type = tns[1]; + namespaces = ( tns[2] || "" ).split( "." ).sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: tns[1], + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + quick: quickParse( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + handlers = events[ type ]; + if ( !handlers ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + t, tns, type, origType, namespaces, origCount, + j, events, special, handle, eventType, handleObj; + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = jQuery.trim( hoverHack( types || "" ) ).split(" "); + for ( t = 0; t < types.length; t++ ) { + tns = rtypenamespace.exec( types[t] ) || []; + type = origType = tns[1]; + namespaces = tns[2]; + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector? special.delegateType : special.bindType ) || type; + eventType = events[ type ] || []; + origCount = eventType.length; + namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + + // Remove matching events + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !namespaces || namespaces.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + eventType.splice( j--, 1 ); + + if ( handleObj.selector ) { + eventType.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( eventType.length === 0 && origCount !== eventType.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData( elem, [ "events", "handle" ], true ); + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Don't do events on text and comment nodes + if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { + return; + } + + // Event object or event type + var type = event.type || event, + namespaces = [], + cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "!" ) >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf( "." ) >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.isTrigger = true; + event.exclusive = exclusive; + event.namespace = namespaces.join( "." ); + event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; + + // Handle a global trigger + if ( !elem ) { + + // TODO: Stop taunting the data cache; remove global events and always attach to document + cache = jQuery.cache; + for ( i in cache ) { + if ( cache[ i ].events && cache[ i ].events[ type ] ) { + jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); + } + } + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + eventPath = [[ elem, special.bindType || type ]]; + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; + old = null; + for ( ; cur; cur = cur.parentNode ) { + eventPath.push([ cur, bubbleType ]); + old = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( old && old === elem.ownerDocument ) { + eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); + } + } + + // Fire handlers on the event path + for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { + + cur = eventPath[i][0]; + event.type = eventPath[i][1]; + + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + // Note that this is a bare JS function and not a jQuery handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + // IE<9 dies on focus/blur to hidden element (#1486) + if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( old ) { + elem[ ontype ] = old; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event || window.event ); + + var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), + delegateCount = handlers.delegateCount, + args = [].slice.call( arguments, 0 ), + run_all = !event.exclusive && !event.namespace, + handlerQueue = [], + i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Determine handlers that should run if there are delegated events + // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) + if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) { + + // Pregenerate a single jQuery object for reuse with .is() + jqcur = jQuery(this); + jqcur.context = this.ownerDocument || this; + + for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { + selMatch = {}; + matches = []; + jqcur[0] = cur; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + sel = handleObj.selector; + + if ( selMatch[ sel ] === undefined ) { + selMatch[ sel ] = ( + handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) + ); + } + if ( selMatch[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, matches: matches }); + } + } + } + + // Add the remaining (directly-bound) handlers + if ( handlers.length > delegateCount ) { + handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); + } + + // Run delegates first; they may want to stop propagation beneath us + for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { + matched = handlerQueue[ i ]; + event.currentTarget = matched.elem; + + for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { + handleObj = matched.matches[ j ]; + + // Triggered event must either 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { + + event.data = handleObj.data; + event.handleObj = handleObj; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + return event.result; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, + originalEvent = event, + fixHook = jQuery.event.fixHooks[ event.type ] || {}, + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = jQuery.Event( originalEvent ); + + for ( i = copy.length; i; ) { + prop = copy[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Target should not be a text node (#504, Safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) + if ( !event.metaKey && event.ctrlKey ) { + event.metaKey = event.ctrlKey; + } + + return fixHook.filter? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady + }, + + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + + focus: { + delegateType: "focusin" + }, + blur: { + delegateType: "focusout" + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +// Some plugins are using, but it's undocumented/deprecated and will be removed. +// The 1.7 special event interface should provide all the hooks needed now. +jQuery.event.handle = jQuery.event.dispatch; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var target = this, + related = event.relatedTarget, + handleObj = event.handleObj, + selector = handleObj.selector, + ret; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !form._submit_attached ) { + jQuery.event.add( form, "submit._submit", function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + }); + form._submit_attached = true; + } + }); + // return undefined since we don't need an event listener + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + jQuery.event.simulate( "change", this, event, true ); + } + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + elem._change_attached = true; + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on.call( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + var handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( var type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + live: function( types, data, fn ) { + jQuery( this.context ).on( types, this.selector, data, fn ); + return this; + }, + die: function( types, fn ) { + jQuery( this.context ).off( types, this.selector || "**", fn ); + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } + + if ( rkeyEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; + } + + if ( rmouseEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + expando = "sizcache" + (Math.random() + '').replace('.', ''), + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rReturn = /\r\n/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context, seed ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set, seed ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set, i, len, match, type, left; + + if ( !expr ) { + return []; + } + + for ( i = 0, len = Expr.order.length; i < len; i++ ) { + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + type, found, item, filter, left, + i, pass, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + filter = Expr.filter[ type ]; + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + pass = not ^ found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Utility function for retreiving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +var getText = Sizzle.getText = function( elem ) { + var i, node, + nodeType = elem.nodeType, + ret = ""; + + if ( nodeType ) { + if ( nodeType === 1 || nodeType === 9 ) { + // Use textContent || innerText for elements + if ( typeof elem.textContent === 'string' ) { + return elem.textContent; + } else if ( typeof elem.innerText === 'string' ) { + // Replace IE's carriage returns + return elem.innerText.replace( rReturn, '' ); + } else { + // Traverse it's children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + } else { + + // If no nodeType, this is expected to be an array + for ( i = 0; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + if ( node.nodeType !== 8 ) { + ret += getText( node ); + } + } + } + return ret; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var first, last, + doneName, parent, cache, + count, diff, + type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + first = match[2]; + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + doneName = match[0]; + parent = elem.parentNode; + + if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { + count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent[ expando ] = doneName; + } + + diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Sizzle.attr ? + Sizzle.attr( elem, name ) : + Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + !type && Sizzle.attr ? + result != null : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context, seed ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet, seed ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +// Override sizzle attribute retrieval +Sizzle.attr = jQuery.attr; +Sizzle.selectors.attrMap = {}; +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + POS.test( selector ) ? + jQuery( selector, this.context ).index( this[0] ) >= 0 : + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array (deprecated as of jQuery 1.7) + if ( jQuery.isArray( selectors ) ) { + var level = 1; + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( i = 0; i < selectors.length; i++ ) { + + if ( jQuery( cur ).is( selectors[ i ] ) ) { + ret.push({ selector: selectors[ i ], elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, slice.call( arguments ).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return ( elem === qualifier ) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; + }); +} + + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", "" ], + legend: [ 1, "
", "
" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + col: [ 2, "", "
" ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }, + safeFragment = createSafeFragment( document ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and + > !!Ox.test.url.parse('/', function(o) { Ox.test(o, Ox.test.result['/']); }) + true + > !!Ox.test.url.parse('/faq#1', function(o) { Ox.test(o, Ox.test.result['/faq#1']); }) + true + > !!Ox.test.url.parse('/cities', function(o) { Ox.test(o, Ox.test.result['/cities']); }) + true + > !!Ox.test.url.parse('/map', function(o) { Ox.test(o, Ox.test.result['/map']); }) + true + > !!Ox.test.url.parse('/-45,-90,45,90', function(o) { Ox.test(o, Ox.test.result['/-45,-90,45,90']); }) + true + > !!Ox.test.url.parse('/@New%20York', function(o) { Ox.test(o, Ox.test.result['/@New%20York']); }) + true + > !!Ox.test.url.parse('/name', function(o) { Ox.test(o, Ox.test.result['/name']); }) + true + > !!Ox.test.url.parse('/-name,population', function(o) { Ox.test(o, Ox.test.result['/-name,population']); }) + true + > !!Ox.test.url.parse('/2342', function(o) { Ox.test(o, Ox.test.result['/2342']); }) + true + > !!Ox.test.url.parse('/2342/map', function(o) { Ox.test(o, Ox.test.result['/2342/map']); }) + true + > !!Ox.test.url.parse('/2342/name', function(o) { Ox.test(o, Ox.test.result['/2342/name']); }) + true + > !!Ox.test.url.parse('/foo', function(o) { Ox.test(o, Ox.test.result['/foo']); }) + true + > !!Ox.test.url.parse('/population=1000,2000', function(o) { Ox.test(o, Ox.test.result['/population=1000,2000']); }) + true + > !!Ox.test.url.parse('/population>0&(name=a*|name=*z)', function(o) { Ox.test(o, Ox.test.result['/population>0&(name=a*|name=*z)']); }) + true + > !!Ox.test.url.parse('/#a?k=v&l=w', function(o) { Ox.test(o, Ox.test.result['/#a?k=v&l=w']); }) + true + > !!Ox.test.url.parse('/#?a=[1,2]&b=true&n=1.2&o={"k":"v"}&s1="foo"&s2=bar', function(o) { Ox.test(o, Ox.test.result['/#?a=[1,2]&b=true&n=1.2&o={"k":"v"}&s1="foo"&s2=bar']); }) + true + > !!Ox.test.url.parse('/#invalid?invalid=true', function(o) { Ox.test(o, Ox.test.result['/#invalid?invalid=true']); }) + true +@*/ + +/* + +example.com[/page][#hash] +or +example.com[/type][/item][/view][/span][/sort][/find][#hash] + +page Special page, like "about" or "contact" +type Section a.k.a. item type, like "movies", "edits", "texts" etc. +item Item id or title, like in '/movies/0060304', '/movies/inception' or + 'texts/ABC'. Testing this is asynchonous. +view List or item view, like "clips" or "map". Both list and item views are + per type. +span Position or selection in a view, either one or two coordinates or one + id, like in "video/01:00", "video/-01:00", "video/01:00,-01:00", + "video/@annotationABC", "video/@subtitles:23", "text/@chapter42", + "map/0,0", "map/-45,-90,45,90", "map/@barcelona", "image/100,100" etc. + Testing id is asynchronous. +sort Sort, like "title" or "-director" or "country,year,-language,+runtime" +find Query, like a=x or a=x&b=y or a=x&(b=y|c=z). A query object has the form + {conditions: [], operator: ''} (logical operator), and a condition + object has the form {key: '', value: '' or ['', ''], operator: ''} + (comparison operator) or {conditions: [], operator: ''} (logical + operator). Condition strings can be more than just "k=v", see below. +hash Anchor and/or query, like 'a' or '?k=v' or 'a?k=v&l=w' or + '?a=[1,2]&b=true&f=1.2&i=3&o={"k":"v"}&s="foo"'. Values are evaluated as + JSON, and if that fails interpreted as a string. So strings (outside + arrays or objects) work without quotes as well, unless their value is + valid JSON, like 'true' or '1'. + +String Key Value Operator +v * v = any text or string contains or any number is +!v * v != no text or string contains and no number is +k=v k v = contains (text or string), is (number) +k!=v k v != does not contain (text or string), is not (number) +k==v k v == is (string) +k!==v k v !== is not (string) +k=v* k v ^ starts with (string) +k!=v* k v !^ does not start with (string) +k=*v k v $ ends with (string) +k!=*v k v !$ does not end with (string) +kv k v > is more than (number) +k!>v k v !> is not more than (number) +k=v,w k [v,w] = is between (number), contains (string or text) +k!=v,w k [v,w] != is not between (number), does not contain (string or text) + +All parts of the URL can be omitted, as long as the order is preserved. + +example.com/foo + If "foo" is not a type, item (of the default type), list view (of the + default type), span id (of any list view of the default type) or sort key + (of any list view of the default type), then this means find *=foo +example.com/title, or example.com/+title or example.com/-title + If this neither matches a type or default type item, then this will be sort +example.com/clip/+duration/title=foo + If "clip" is a default type list view, this will show all clips of items + that match title=foo, sorted by item duration in ascending order +example.com/clip/+clip.duration/subtitles=foo + If "clip" is a default type list view and "subtitles" is an annotation type, + this will show all clips that match subtitles=foo, sorted by clip duration + in ascending order. (In pan.do/ra's clip view, annotation=foo is always per + clip. There is no way to show all clips of all items where any clip matches + subtitles=foo, this doesn't seem to be needed.) +example.com/map/@paris/duration/title!=london + If "map" is a default type list view and "paris" is a place name, this will + zoom the map to Paris, show all places of items that match title!=london, + and when a place is selected sort matching clips by item duration in + default order. +example.com/calendar/1900,2000/clip:duration/event=hiroshima + If "calendar" is a default type list view, this will zoom the calendar to + the 20th century, show all events of all items that match event=hiroshima, + and when an event is selected sort matching clips by clip duration in + default order. (In pan.do/ra's map and calendar view, annotation=foo is + always per item. There is no way to show all events of all clips that match + event=hiroshima, this doesn't seem to be needed.) + +example.com/2001/2001 -> example.com/0062622/video/00:33:21 + 2001 matches an item title (word match), the second 2001 is a valid duration +example.com/2002/2002 -> example.com/calendar/2002/2002 + 2002 is a valid duration, but no list view supports durations. Then it is + read as a year, and we get calendar view with find *=2002 +example.com/@paris/london -> example.com/map/@paris/london + paris matches place ABC (case-insensitive), but (assuming) find *=london + does not match place ABC, "paris" becomes the map query +example.com/@paris/paris -> example.com/map/ABC/paris + paris matches place ABC (case-insensitive), so we get map view, zoomed to + ABC/Paris, which is selected, with find *=paris +example.com/@renaissance/renaissance -> example.com/calendar/ABC/renaissance + renaissaince matches an event name (case-insensitive), so we get calendar + view, zoomed to the Renaissance, with find *=renaissance +example.com/@foo/foo -> example.com/map/@foo/foo + foo doesn't match a place or event name, but getSpan() sets the map query to + foo and returns @foo, so we get map view, zoomed to Foo, with find *=foo +example.com/clip:duration -> example.com/clip/clip:duration + clip:duration is not a sort key of the default view (grid), so the view is + set to the first list view that accepts this sort key + +*/ + +Ox.URL = function(options) { + + var self = {}, that = {}; + + self.options = Ox.extend({ + // fixme: find keys are also per type/list|item/view + // since one can search for layer properties in some item views + findKeys: [], + getHash: null, + getItem: null, + getSpan: null, + pages: [], + spanType: {}, + sortKeys: {}, + types: [], + views: {} + }, options); + + if (Ox.every(self.options.findKeys, function(findKey) { + return findKey.id != '*'; + })) { + self.options.findKeys.push({id: '*', type: 'string'}); + } + + self.previousTitle = ''; + self.previousURL = ''; + + window.addEventListener('popstate', function() { + self.previousTitle = document.title; + self.previousURL = document.location.pathname + + document.location.search + + document.location.hash; + }); + + function constructCondition(condition) { + var key = condition.key == '*' ? '' : condition.key, + operator = condition.operator, + value; + value = ( + Ox.isArray(condition.value) ? condition.value : [condition.value] + ).map(function(value) { + return encodeValue(constructValue(value, condition.key)); + }).join(','); + if (!key) { + operator = operator.replace('=', ''); + } else if (operator.indexOf('^') > -1) { + operator = operator.replace('^', '='); + value += '*'; + } else if (operator.indexOf('$') > -1) { + operator = operator.replace('$', '='); + value = '*' + value; + } + return [key, operator, value].join(''); + } + + function constructDate(date) { + return Ox.formatDate(date, '%Y-%m-%d', true); + } + + function constructDuration(duration) { + return Ox.formatDuration(duration, 3).replace(/\.000$/, ''); + } + + function constructFind(find) { + return find.conditions.map(function(condition) { + return condition.conditions + ? '(' + constructFind(condition) + ')' + : constructCondition(condition); + }).join(find.operator); + } + + function constructHash(hash) { + var obj = {}; + if (hash.query) { + hash.query.forEach(function(condition) { + obj[condition.key] = condition.value; + }); + } + return hash.anchor || hash.query + ? '#' + ( + hash.anchor || '' + ) + ( + hash.query ? '?' + Ox.serialize(obj) : '' + ) + : ''; + } + + function constructLocation(location) { + return location.join(','); + } + + function constructSort(sort, state) { + var sortKeys = self.options.sortKeys[state.type][ + !state.item ? 'list' : 'item' + ][state.view]; + return sortKeys ? sort.map(function(sort) { + return ( + Ox.getObjectById(sortKeys, sort.key).operator == sort.operator + ? '' : sort.operator + ) + sort.key; + }).join(',') : ''; + } + + function constructSpan(span, state) { + var view = state.view || self.options.views[state.type][ + !state.item ? 'list' : 'item' + ][0], + spanType = self.options.spanType[state.type][ + !state.item ? 'list' : 'item' + ][view]; + return (Ox.isArray(span) ? span : [span]).map(function(point) { + return Ox.isNumber(point) ? ( + spanType == 'date' ? constructDate(point) + : spanType == 'duration' ? constructDuration(point) + : spanType == 'location' ? constructLocation(point) + : point + ) : point; + }).join(','); + } + + function constructURL(state) { + var parts = []; + if (state.page) { + parts.push(state.page); + } else { + if (self.options.types.indexOf(state.type) > 0) { + parts.push(state.type); + } + if (state.item) { + parts.push(state.item); + } + if (state.type && self.options.views[state.type][ + state.item ? 'item' : 'list' + ].indexOf(state.view) > -1) { + parts.push(state.view); + } + if (state.span && state.span.length) { + parts.push(constructSpan(state.span, state)); + } + if (state.sort && state.sort.length) { + parts.push(constructSort(state.sort, state)); + } + if (state.find) { + parts.push(constructFind(state.find)); + } + } + return '/' + Ox.filter(parts).join('/') + ( + state.hash ? constructHash(state.hash) : '' + ); + } + + function constructValue(str, key) { + var findKey = Ox.getObjectById(self.options.findKeys, key), + type = Ox.isArray(findKey.type) ? findKey.type[0] : findKey.type, + value = str, + values = findKey.values; + return type == 'enum' ? values[value] : value; + } + + function decodeValue(value) { + return decodeURIComponent(value); + } + + function encodeValue(value) { + // var chars = '/&|()=*:'; + var chars = '&|()=*', + ret = ''; + value.toString().split('').forEach(function(char) { + var index = chars.indexOf(char); + ret += index > -1 + ? '%' + char.charCodeAt(0).toString(16).toUpperCase() + : char; + }); + return ret; + } + + function isNumericalSpan(str) { + return str.split(',').every(function(str) { + return /^[0-9-\.:]+$/.test(str); + }); + } + + function getSpanType(str, types) { + Ox.Log('Core', 'getSpanType', str, types) + var canBeDate = types.indexOf('date') > -1, + canBeDuration = types.indexOf('duration') > -1, + canBeLocation = types.indexOf('location') > -1, + canBeNumber = types.indexOf('number') > -1, + length = str.split(',').length; + return canBeDate && /\d-/.test(str) ? 'date' + : canBeDuration && /:/.test(str) ? 'duration' + : canBeLocation && length == 4 ? 'location' + // leaves us with [-]D[.D][,[-]D[.D]] + : canBeDuration ? 'duration' + : canBeDate && !/\./.test(str) && !/^\d{7}$/.test(str) ? 'date' + : canBeLocation && length == 2 ? 'location' + : canBeNumber && /^\d+$/.test(str) ? 'number' + : ''; + // !/^\d{7}$/.test(str) avoids matching imdb ids + } + + function parseCondition(str) { + Ox.Log('Core', 'PARSE COND', str) + var condition = {}, + operators = ['!==', '==', '!=', '=', '!<', '<', '!>', '>'], + split; + str = str.replace(/%3C/g, '<').replace(/%3E/g, '>'); + Ox.forEach(operators, function(operator) { + if (str.indexOf(operator) > -1) { + split = str.split(operator); + condition = { + key: split.shift(), + value: split.join(operator), + operator: operator + }; + return false; // break + } + }); + if ( + !condition.operator + || Ox.getIndexById(self.options.findKeys, condition.key) == -1 + ) { + // missing operator or unknown key + condition = {key: '*', value: str, operator: '='}; + } + if (['=', '!='].indexOf(condition.operator) > -1) { + if (condition.value[0] == '*') { + condition.value = condition.value.slice(1); + condition.operator = condition.operator.replace('=', '$') + } else if (condition.value[condition.value.length - 1] == '*') { + condition.value = condition.value.slice(0, -1); + condition.operator = condition.operator.replace('=', '^') + } + } + if ( + ['date', 'enum', 'float', 'integer', 'time', 'year'].indexOf( + Ox.getObjectById(self.options.findKeys, condition.key).type + ) > -1 + && condition.value.indexOf(',') > -1 + ) { + condition.value = condition.value.split(',').map(function(value) { + return parseValue(decodeValue(value), condition.key); + }); + } else { + condition.value = parseValue(decodeValue(condition.value), condition.key); + } + Ox.Log('Core', 'PARSE COND', str, condition); + return condition; + } + + function parseDate(str) { + return Ox.formatDate(Ox.parseDate(str, true), '%Y-%m-%d'); + } + + function parseDuration(str) { + return Ox.parseDuration(str); + } + + function parseFind(str) { + str = (str || '').replace(/%7C/g, '|'); + var conditions, counter = 0, + find = {conditions: [], operator: '&'}, + subconditions = []; + if (str.length) { + // replace subconditions with placeholder, + // so we can later split by main operator + Ox.forEach(str, function(c, i) { + if (c == ')') { + counter--; + } + if (counter >= 1) { + subconditions[subconditions.length - 1] += c; + } + if (c == '(') { + (++counter == 1) && subconditions.push(''); + } + }); + subconditions = subconditions.filter(function(subcondition) { + // make sure empty brackets don't throw errors + return !!subcondition; + }); + subconditions.forEach(function(subcondition, i) { + str = str.replace(subcondition, i); + }); + find.operator = str.indexOf('|') > -1 ? '|' : '&' + find.conditions = str.split(find.operator).map(function(condition, i) { + var ret; + if (condition[0] == '(') { + // re-insert subcondition + ret = parseFind(subconditions[parseInt(condition.slice(1, -1))]); + } else { + ret = parseCondition(condition); + } + return ret; + }); + } + return find; + } + + function parseHash(str) { + var hash = {}, + split = str.split('?'); + if (split[0]) { + hash.anchor = decodeValue(split[0]); + } + if (split[1]) { + Ox.forEach(Ox.unserialize(split[1], true), function(value, key) { + hash.query = hash.query || []; + hash.query.push({ + key: key, + value: value + }); + }); + } + return hash; + } + + function parseLocation(str) { + return str.split(',').map(function(str, i) { + return Ox.limit(parseInt(str, 10), -90 * (i + 1), 90 * (i + 1)); + }); + } + + function parseNumber(str) { + return parseInt(str); + } + + function parseSort(str, state) { + return str.split(',').map(function(str) { + var hasOperator = /^[\+-]/.test(str); + return { + key: hasOperator ? str.slice(1) : str, + operator: hasOperator + ? str[0] + : Ox.getObjectById(self.options.sortKeys[state.type][ + !state.item ? 'list' : 'item' + ][state.view], str).operator + }; + }); + } + + function parseSpan(str, type) { + var split = str.split(','); + if (split.length == 4) { + split = [split[0] + ',' + split[1], split[2] + ',' + split[3]]; + } + return split.map( + type == 'date' ? parseDate + : type == 'duration' ? parseDuration + : type == 'location' ? parseLocation + : parseNumber + ); + } + + function parseURL(str, callback) { + // fixme: removing trailing slash makes it impossible to search for '/' + var split = str.split('#'), + parts = split.shift().replace(/(^\/|\/$)/g, '').split('/'), + state = split.length && split[0].length + ? {hash: parseHash(split.join('#'))} + : {}; + if (parts[0] == '') { + // empty URL + getHash(); + } else if (self.options.pages.indexOf(parts[0]) > -1) { + // page + state.page = parts[0]; + getHash(); + } else { + if (self.options.types.indexOf(parts[0]) > -1) { + // type + state.type = parts[0]; + parts.shift(); + } else { + // set to default type + state.type = self.options.types[0]; + } + if (parts.length) { + Ox.Log('Core', 'ST', state.type, self.options.views) + if (self.options.views[state.type].list.indexOf(parts[0]) > -1) { + // list view + state.item = ''; + state.view = parts[0]; + parts.shift(); + parseBeyondItem(); + } else { + // test for item id or name + self.options.getItem(state, parts[0].replace(/%20/g, ' '), function() { + // may have modified state.item + if (state.item) { + parts.shift(); + } + parseBeyondItem(); + }); + } + } else { + state.item = ''; + // set to default view + state.view = self.options.views[state.type].list[0]; + getHash(); + } + } + function parseBeyondItem() { + Ox.Log('Core', 'pBI', state, parts.join('/')); + var span, spanType, spanTypes; + if ( + parts.length && state.item + && self.options.views[state.type].item.indexOf(parts[0]) > -1 + ) { + // item view + state.view = parts[0]; + parts.shift(); + } + if (parts.length) { + if (isNumericalSpan(parts[0])) { + // test for numerical span + spanTypes = self.options.spanType[state.type][ + !state.item ? 'list' : 'item' + ]; + // if no view is given then parse the span anyway, + // but make sure the span type could match a view + spanType = state.view + ? spanTypes[state.view] + : getSpanType(parts[0], Ox.unique(Ox.values(spanTypes))); + Ox.Log('URL', 'SPAN TYPE', spanType) + if (spanType) { + span = parseSpan(parts[0], spanType); + if (span) { + if (state.view) { + state.span = span; + parts.shift(); + } else { + // if no view is given then switch to the first + // view that supports a span of this type + Ox.forEach(self.options.views[state.type][ + !state.item ? 'list' : 'item' + ], function(view) { + if (spanTypes[view] == spanType) { + state.view = view; + state.span = span; + parts.shift(); + return false; // break + } + }); + } + } + } + } + if (!state.span && /^[A-Z@]/.test(parts[0])) { + // test for span id or name + self.options.getSpan(state, decodeValue(parts[0]), function() { + // may have modified state.view and state.span + if (state.span) { + parts.shift(); + } + parseBeyondSpan(); + }); + } else { + parseBeyondSpan(); + } + } else { + if (!state.view) { + // set to default item view + state.view = self.options.views[state.type].item[0]; + } + getHash(); + } + } + function parseBeyondSpan() { + Ox.Log('Core', 'pBS', state, parts) + var sortKeyIds, sortParts; + if (parts.length) { + sortParts = parts[0].split(','); + sortKeyIds = Ox.map(self.options.sortKeys[state.type][ + !state.item ? 'list' : 'item' + ], function(sortKeys) { + return sortKeys.map(function(sortKey) { + return sortKey.id; + }); + }); + // test if sort keys match the given view, + // or any view if no view is given + Ox.forEach( + state.view ? [state.view] + : self.options.views[state.type][!state.item ? 'list' : 'item'], + function(view) { + if (sortKeyIds[view] && sortParts.every(function(part) { + return sortKeyIds[view].indexOf(part.replace(/^[\+-]/, '')) > -1; + })) { + if (!state.view) { + // set list or item view + state.view = view; + } + // sort + state.sort = parseSort(parts[0], state); + parts.shift(); + return false; // break + } + } + ); + } + if (!state.view) { + // set to default list or item view + state.view = self.options.views[state.type][ + !state.item ? 'list' : 'item' + ][0]; + } + if (parts.length) { + // find + state.find = parseFind(parts.join('/')); + } + getHash(); + } + function getHash() { + if (self.options.getHash) { + self.options.getHash(state, function() { + // may have modified state.hash + callback(state); + }); + } else { + callback(state); + } + } + } + + function parseValue(str, key) { + var findKey = Ox.getObjectById(self.options.findKeys, key), + type = Ox.isArray(findKey.type) ? findKey.type[0] : findKey.type, + value = str, + values = findKey.values; + if (type == 'boolean') { + value = ['', 'false'].indexOf(str) == -1; + } else if (type == 'date') { + value = Ox.formatDate(Ox.parseDate(str, true), '%F', true); + } else if (type == 'enum') { + value = Math.max(values.map(function(value) { + return value.toLowerCase(); + }).indexOf(str.toLowerCase()), 0); + } else if (type == 'float') { + value = parseFloat(str) || 0; + } else if (type == 'integer') { + value = Math.round(str) || 0; + } else if (type == 'time') { + value = Ox.formatDuration(Ox.parseDuration(value)); + } else if (type == 'year') { + value = Math.round(str) || 1970; + } + return value.toString(); + } + + function saveURL() { + + } + + /*@ + parse parse + (callback) -> parse state from document.location + (url, callback) -> parse state from passed url + @*/ + that.parse = function() { + var str = arguments.length == 2 ? arguments[0] + : document.location.pathname + + document.location.search + + document.location.hash, + callback = arguments[arguments.length - 1]; + parseURL(str, callback); + return that; + }; + + /*@ + pop Sets the URL to the previous URL + @*/ + that.pop = function() { + if (self.previousURL) { + history.pushState && history.pushState( + {}, self.previousTitle, self.previousURL + ); + document.title = self.previousTitle; + } + return !!self.previousURL; + }; + + /*@ + push Pushes a new URL + (state, title, url, callback) -> URL controller + state State for the new URL + If state is null, it will be derived from url + title Title for the new URL + url New URL + If url is null, it will be derived from state + callback callback function + state New state + @*/ + that.push = function(state, title, url, callback) { + if (!state) { + parseURL(url, function(state) { + pushState(state, title, url); + }); + } else { + url = url || constructURL(state); + pushState(state, title, url); + } + function pushState(state, title, url) { + self.previousTitle = document.title; + self.previousURL = document.location.pathname + + document.location.search + + document.location.hash; + if (url != self.previousURL) { + history.pushState && history.pushState( + Ox.extend(state, {title: title}), '', url + ); + document.title = title; + callback && callback(state); + } + } + } + + /*@ + replace Replaces the URL with a new URL + (state, title, url, callback) -> URL controller + state State for the new URL + If state is null, it will be derived from url + title Title for the new URL + url New URL + If url is null, it will be derived from state + callback callback function + state New state + @*/ + that.replace = function(state, title, url, callback) { + if (!state) { + parseURL(url, function(state) { + replaceState(state, title, url); + }); + } else { + url = url || constructURL(state); + replaceState(state, title, url); + } + function replaceState(state, title, url) { + history.replaceState && history.replaceState( + Ox.extend(state, {title: title}), '', url + ); + document.title = title; + callback && callback(state); + } + } + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/ArrayEditable.js b/demo/static/OxJS/dev/Ox.UI/js/Form/ArrayEditable.js new file mode 100644 index 0000000..6c65d88 --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/ArrayEditable.js @@ -0,0 +1,445 @@ +'use strict'; + +/*@ +Ox.ArrayEditable Array Editable + options Options object + self Shared private variable + ([options[, self]]) -> Array Editable + add add + blur blur + change change + delete delete + edit edit + insert insert + open open + selectnext selectnext + selectprevious selectprevious + selectnone selectnone + select select + submit submit +@*/ + +Ox.ArrayEditable = function(options, self) { + + self = self || {}; + var that = Ox.Element({}, self) + .defaults({ + clickLink: null, + editable: true, + getSortValue: null, + highlight: '', + itemName: 'item', + items: [], + maxHeight: void 0, + placeholder: '', + position: -1, + selected: '', + separator: ',', + sort: [], + submitOnBlur: true, + tooltipText: '', + type: 'input', + width: 256 + }) + .options(options || {}) + .update({ + highlight: function() { + self.$items.forEach(function($item) { + $item.options({highlight: self.options.highlight}) + }); + }, + items: function() { + if (self.options.selected && getSelectedPosition() == -1) { + selectNone(); + } + renderItems(true); + }, + placeholder: function() { + if (self.options.items.length == 0) { + self.$items[0] + .options({value: self.options.placeholder}) + .addClass('OxPlaceholder'); + } + }, + selected: function() { + selectItem(self.options.selected); + }, + sort: renderItems, + width: function() { + var width = self.options.width; + that.css({width: width - 8 + 'px'}); // 2 x 4 px padding + self.options.type == 'textarea' && self.$items.forEach(function($item) { + $item.options({width: width}) + }); + } + }) + .addClass('OxArrayEditable OxArrayEditable' + Ox.toTitleCase(self.options.type)) + .css({width: self.options.width - (self.options.type == 'input' ? 8 : 0) + 'px'}) // 2 x 4 px padding + .bindEvent({ + key_delete: deleteItem, + key_enter: function() { + // make sure the newline does + // not end up in the textarea + setTimeout(function() { + that.editItem(); + }, 0); + }, + key_escape: selectNone, + key_down: self.options.type == 'input' ? selectLast : selectNext, + key_left: self.options.type == 'input' ? selectPrevious : selectFirst, + key_right: self.options.type == 'input' ? selectNext : selectLast, + key_up: self.options.type == 'input' ? selectFirst : selectPrevious, + singleclick: singleclick + }); + + self.$items = []; + self.editing = false; + + renderItems(); + + self.selected = getSelectedPosition(); + + function deleteItem() { + if (self.options.editable) { + self.options.items.splice(self.selected, 1); + renderItems(); + that.triggerEvent('delete', { + id: self.options.selected + }); + self.editing = false; + self.selected = -1; + self.options.selected = ''; + } + } + + function doubleclick(e) { + // fixme: unused + var $target = $(e.target), + $parent = $target.parent(); + if ($parent.is('.OxEditableElement')) { + that.editItem(); + } else if (!$target.is('.OxInput')) { + that.triggerEvent('add'); + } + } + + function getSelectedId() { + return self.selected > -1 ? self.options.items[self.selected].id : ''; + } + + function getSelectedPosition() { + return Ox.getIndexById(self.options.items, self.options.selected); + } + + function renderItems(blur) { + if (self.editing) { + self.options.items[getSelectedPosition()].value = that.find(self.options.type + ':visible').val(); + } + that.empty(); + if (self.options.items.length == 0) { + self.$items[0] = Ox.Editable({ + editable: false, + type: self.options.type, + value: self.options.placeholder + }) + .addClass('OxPlaceholder') + .appendTo(that); + } else { + sortItems(); + self.options.items.forEach(function(item, i) { + if (i && self.options.type == 'input') { + $('') + .addClass('OxSeparator') + .html(self.options.separator + ' ') + .appendTo(that); + } + self.$items[i] = Ox.Editable({ + blurred: self.editing && i == self.selected ? blur : false, + clickLink: self.options.clickLink, + editable: self.options.editable && item.editable, + editing: self.editing && i == self.selected, + /* + format: function(value) { + return value || ' ' + }, + */ + highlight: self.options.highlight, + maxHeight: self.options.maxHeight, + submitOnBlur: self.options.submitOnBlur, + tooltip: ( + self.options.tooltipText + ? self.options.tooltipText(item) + '
' + : '' + ) + ( + self.options.editable + ? Ox._('Click to select') + ( + item.editable ? Ox._(', doubleclick to edit') : '' + ) + : '' + ), + type: self.options.type, + value: item.value, + width: self.options.type == 'input' ? 0 : self.options.width - 9 + }) + .addClass(item.id == self.options.selected ? 'OxSelected' : '') + //.css(self.options.type == 'textarea' ? {padding: '4px'} : {}) + .data({id: item.id, position: i}) + .bindEvent({ + blur: function(data) { + // fixme: remove data + that.gainFocus(); + that.triggerEvent('blur', { + id: item.id, + value: data.value + }); + self.blurred = true; + setTimeout(function() { + self.blurred = false; + }, 250); + }, + cancel: function(data) { + self.editing = false; + that.gainFocus(); + data.value === '' + ? submitItem(i, '') + : that.triggerEvent('blur', data); + }, + change: function(data) { + that.triggerEvent('change', { + id: item.id, + value: data.value + }); + }, + edit: function() { + if (item.id != self.options.selected) { + selectItem(item.id); + } + self.editing = true; + that.triggerEvent('edit'); + }, + insert: function(data) { + that.triggerEvent('insert', data); + }, + open: function(data) { + that.triggerEvent('open'); + }, + submit: function(data) { + self.editing = false; + that.gainFocus(); + submitItem(i, data.value); + } + }) + .appendTo(that); + }); + } + //self.editing && that.editItem(blur); + } + + function selectFirst() { + if (self.selected > -1) { + self.selected > 0 + ? selectItem(0) + : that.triggerEvent('selectprevious'); + } + } + + function selectItem(idOrPosition) { + if (Ox.isString(idOrPosition)) { + self.options.selected = idOrPosition; + self.selected = getSelectedPosition(); + } else { + self.selected = idOrPosition; + self.options.selected = getSelectedId(); + } + if (/*self.options.selected == '' && */self.editing) { + self.editing = false; + that.blurItem(); + } + that.find('.OxSelected').removeClass('OxSelected'); + self.selected > -1 && self.$items[self.selected].addClass('OxSelected'); + triggerSelectEvent(); + } + + function selectLast() { + if (self.selected > -1) { + self.selected < self.options.items.length - 1 + ? selectItem(self.options.items.length - 1) + : that.triggerEvent('selectnext'); + } + } + + function selectNext() { + if (self.selected > -1) { + self.selected < self.options.items.length - 1 + ? selectItem(self.selected + 1) + : that.triggerEvent('selectnext'); + } + } + + function selectNone() { + selectItem(-1); + } + + function selectPrevious() { + if (self.selected > -1) { + self.selected > 0 + ? selectItem(self.selected - 1) + : that.triggerEvent('selectprevious'); + } + } + + function singleclick(e) { + var $target = $(e.target), + $element = $target.is('.OxEditableElement') + ? $target : $target.parents('.OxEditableElement'), + position = $element.data('position'); + if (!$target.is('.OxInput')) { + if ($element.length) { + // if clicked on an element + if (position != self.selected) { + // select another item + selectItem(position); + } else if (e.metaKey) { + // or deselect current item + selectNone(); + } + } else if (!self.blurred) { + // otherwise, if there wasn't an active input element + if (self.editing) { + // blur if still in editing mode + that.blurItem(); + } else { + // otherwise + if (self.selected > -1) { + // deselect selected + selectNone(); + } else { + // or trigger event + that.triggerEvent('selectnone'); + } + } + } + that.gainFocus(); + } + } + + function sortItems() { + if (!Ox.isEmpty(self.options.sort)) { + self.options.items = Ox.sortBy( + self.options.items, + self.options.sort, + self.options.getSortValue + ? {value: self.options.getSortValue} + : {} + ); + self.selected = getSelectedPosition(); + } + } + + function submitItem(position, value) { + var item = self.options.items[position]; + if (value === '') { + deleteItem(); + } else { + that.triggerEvent(item.value === value ? 'blur' : 'submit', { + id: item.id, + value: value + }); + item.value = value; + } + } + + function triggerSelectEvent() { + if (!self.triggered) { + that.triggerEvent('select', { + id: self.options.selected + }); + self.triggered = true; + setTimeout(function() { + self.triggered = false; + }, 250); + } + } + + /*@ + addItem addItem + (position, item) -> add item at position + @*/ + that.addItem = function(position, item) { + if (self.options.editable) { + self.options.items.splice(position, 0, item); + renderItems(); + } + return that; + //that.triggerEvent('add'); + /* + self.values = Ox.filter(values, function(value) { + return value; + }); + self.values.push(''); + renderItems(); + Ox.last(self.$items).triggerEvent('doubleclick'); + */ + }; + + /*@ + blurItem blurItem + @*/ + that.blurItem = function() { + /* + if (self.options.selected) { + self.$items[self.selected].options({editing: false}); + } else { + */ + self.editing = false; + self.$items.forEach(function($item) { + $item.options({editing: false}); + }); + //} + return that; + }; + + /*@ + editItem editItem + @*/ + that.editItem = function() { + Ox.Log('AE', 'EDIT ITEM', self.options.editable, self.options.selected); + if (self.options.editable && self.options.selected) { + self.editing = true; + self.$items[self.selected].options({editing: true}); + } else if (!self.options.editable) { + that.triggerEvent('open'); + } + return that; + }; + + /*@ + reloadItems reloadItems + @*/ + that.reloadItems = function() { + renderItems(); + return that; + }; + + /*@ + removeItem removeItem + @*/ + that.removeItem = function() { + if (self.options.editable && self.options.selected) { + deleteItem(); + } + return that; + }; + + /* + that.submitItem = function() { + if (self.editing) { + self.editing = false; + self.$items[self.selected].options({editing: false}); + } + } + */ + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/ArrayInput.js b/demo/static/OxJS/dev/Ox.UI/js/Form/ArrayInput.js new file mode 100644 index 0000000..93955ce --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/ArrayInput.js @@ -0,0 +1,198 @@ +'use strict'; + +/*@ +Ox.ArrayInput Array input + options Options object + label string, '' + max integer, maximum number of items, 0 for all + sort fixme: this should probably be removed + value <[]> value + width width + self Shared private variable + ([options[, self]]) -> Array input + change change +@*/ + +Ox.ArrayInput = function(options, self) { + + self = self || {}; + var that = Ox.Element({}, self) + .defaults({ + label: '', + max: 0, + sort: false, // fixme: this should probably be removed + value: [], + width: 256 + }) + .options(options || {}) + .update({ + value: setValue, + width: setWidths + }); + + if (self.options.label) { + self.$label = Ox.Label({ + title: self.options.label, + width: self.options.width + }) + .appendTo(that); + } + + self.$element = []; + self.$input = []; + self.$removeButton = []; + self.$addButton = []; + + ( + self.options.value.length ? self.options.value : [''] + ).forEach(function(value, i) { + addInput(i, value); + }); + + self.options.value = getValue(); + + function addInput(index, value, focus) { + Ox.Log('Form', 'add', index) + self.$element.splice(index, 0, Ox.Element() + .css({ + height: '16px', + marginTop: self.options.label || index > 0 ? '8px' : 0 + }) + .data({index: index})); + if (index == 0) { + self.$element[index].appendTo(that); + } else { + self.$element[index].insertAfter(self.$element[index - 1]); + } + self.$input.splice(index, 0, Ox.Input({ + value: value, + width: self.options.width - 48 + }) + .css({float: 'left'}) + .bindEvent({ + change: function(data) { + self.options.sort && data.value !== '' && sortInputs(); + self.options.value = getValue(); + that.triggerEvent('change', { + value: self.options.value + }); + } + }) + .appendTo(self.$element[index])); + focus && self.$input[index].focusInput(true); + self.$removeButton.splice(index, 0, Ox.Button({ + title: self.$input.length == 1 ? 'close' : 'remove', + type: 'image' + }) + .css({float: 'left', marginLeft: '8px'}) + .on({ + click: function() { + var index = $(this).parent().data('index'); + if (self.$input[index].value() !== '') { + self.$input[index].value(''); + self.options.value = getValue(); + that.triggerEvent('change', { + value: self.options.value + }); + } + if (self.$input.length == 1) { + self.$input[0].focusInput(true); + } else { + removeInput(index); + } + } + }) + .appendTo(self.$element[index])); + self.$addButton.splice(index, 0, Ox.Button({ + disabled: index == self.options.max - 1, + title: 'add', + type: 'image' + }) + .css({float: 'left', marginLeft: '8px'}) + .on({ + click: function() { + var index = $(this).parent().data('index'); + addInput(index + 1, '', true); + } + }) + .appendTo(self.$element[index])); + updateInputs(); + } + + function getValue() { + return Ox.map(self.$input, function($input) { + return $input.value(); + }).filter(function(value) { + return value !== ''; + }); + }; + + function removeInput(index) { + Ox.Log('Form', 'remove', index); + [ + 'input', 'removeButton', 'addButton', 'element' + ].forEach(function(element) { + var key = '$' + element; + self[key][index].remove(); + self[key].splice(index, 1); + }); + updateInputs(); + } + + function setValue() { + while (self.$input.length) { + removeInput(0); + } + ( + self.options.value.length ? self.options.value : [''] + ).forEach(function(value, i) { + addInput(i, value); + }); + } + + function setWidths() { + self.$label && self.$label.options({width: self.options.width}) + self.$element.forEach(function($element, i) { + $element.css({width: self.options.width + 'px'}); + self.$input[i].options({width: self.options.width - 48}); + }); + } + + function sortInputs() { + Ox.sort(self.$element, function($element) { + return self.$input[$element.data('index')].value(); + }).forEach(function($element) { + $element.detach(); + }); + self.$element.forEach(function($element, i) { + $element.data({index: i}).appendTo(that); + }); + } + + function updateInputs() { + self.$element.forEach(function($element, i) { + $element.data({index: i}); + self.$removeButton[i].options({ + title: self.$element.length == 1 ? 'close' : 'remove' + }); + self.$addButton[i].options({ + disabled: self.$element.length == self.options.max + }); + }); + } + + /*@ + setErrors setErrors + (values) -> set errors + @*/ + that.setErrors = function(values) { + self.$input.forEach(function($input) { + $input[ + values.indexOf($input.value()) > -1 ? 'addClass' : 'removeClass' + ]('OxError'); + }); + }; + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/Button.js b/demo/static/OxJS/dev/Ox.UI/js/Form/Button.js new file mode 100644 index 0000000..b6c1e6d --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/Button.js @@ -0,0 +1,183 @@ +'use strict'; + +/*@ +Ox.Button Button Object + options Options object + If a button is both selectable and has two values, its value is the + selected id, and the second value corresponds to the selected state + disabled If true, button is disabled + group If true, button is part of group + id Element id + overlap 'none', 'left' or 'right' + selectable If true, button is selectable + style 'default', 'checkbox', 'symbol', 'tab' or 'video' + title Button title + tooltip Tooltip + type 'text' or 'image' + value True for selected, or current value id + values <[o]|[]> [{id, title}, {id, title}] + width Button width + self Shared private variable + ([options[, self]]) -> Button Object + click non-selectable button was clicked + change selectable button was clicked +@*/ + +Ox.Button = function(options, self) { + + self = self || {}; + var that = Ox.Element('', self) + .defaults({ + disabled: false, + group: false, + id: '', + overlap: 'none', + selectable: false, + size: 'medium', + // fixme: 'default' or ''? + style: 'default', + title: '', + tooltip: '', + type: 'text', + value: void 0, + values: [], + width: 'auto' + }) + .options(Ox.isArray(options.tooltip) ? Ox.extend(Ox.clone(options), { + tooltip: options.tooltip[0] + }) : options || {}) + .update({ + disabled: setDisabled, + //FIXME: check if this is still needed + tooltip: function() { + that.$tooltip.options({title: self.options.disabled}); + }, + title: setTitle, + value: function() { + if (self.options.values.length) { + self.options.title = Ox.getObjectById( + self.options.values, self.options.value + ).title; + setTitle(); + } + self.options.selectable && setSelected(); + }, + width: function() { + that.$element.css({width: (self.options.width - 14) + 'px'}); + } + }) + .addClass( + 'OxButton Ox' + Ox.toTitleCase(self.options.size) + + (self.options.disabled ? ' OxDisabled': '') + + (self.options.selectable && self.options.value ? ' OxSelected' : '') + + (self.options.style != 'default' ? ' Ox' + Ox.toTitleCase(self.options.style) : '') + + (self.options.overlap != 'none' ? ' OxOverlap' + Ox.toTitleCase(self.options.overlap) : '') + ) + .attr({ + disabled: self.options.disabled, + type: self.options.type == 'text' ? 'button' : 'image' + }) + .css(self.options.width == 'auto' ? {} : { + width: (self.options.width - 14) + 'px' + }) + .mousedown(mousedown) + .click(click); + + if (self.options.values.length) { + self.options.values = self.options.values.map(function(value) { + return { + id: value.id || value, + title: value.title || value + }; + }); + self.value = Ox.getIndexById(self.options.values, self.options.value); + if (self.value == -1) { + self.value = 0; + self.options.value = self.options.values[0].id; + } + self.options.title = self.options.values[self.value].title; + } else if (self.options.selectable) { + self.options.value = self.options.value || false; + } + + setTitle(); + + if (Ox.isArray(options.tooltip)) { + self.options.tooltip = options.tooltip; + that.$tooltip.options({ + title: self.options.tooltip[self.value] + }); + } + + function click() { + if (!self.options.disabled) { + that.$tooltip && that.$tooltip.hide(); + that.triggerEvent('click'); + if (self.options.values.length || self.options.selectable) { + that.toggle(); + that.triggerEvent('change', {value: self.options.value}); + } + } + } + + function mousedown(e) { + if (self.options.type == 'image' && $.browser.safari) { + // keep image from being draggable + e.preventDefault(); + } + } + + function setDisabled() { + that.attr({disabled: self.options.disabled}); + that[self.options.disabled ? 'addClass' : 'removeClass']('OxDisabled'); + self.options.disabled && that.$tooltip && that.$tooltip.hide(); + self.options.type == 'image' && setTitle(); + } + + function setSelected() { + that[self.options.value ? 'addClass' : 'removeClass']('OxSelected'); + self.options.type == 'image' && setTitle(); + } + + function setTitle() { + if (self.options.type == 'image') { + that.attr({ + src: Ox.UI.getImageURL( + 'symbol' + self.options.title[0].toUpperCase() + + self.options.title.slice(1), + self.options.style == 'video' ? 'video' + : self.options.disabled ? 'disabled' + : self.options.selectable && self.options.value ? 'selected' + : '' + ) + }); + } else { + that.val(self.options.title); + } + } + + /*@ + toggle toggle + () -> toggle button + @*/ + that.toggle = function() { + if (self.options.values.length) { + self.value = 1 - Ox.getIndexById(self.options.values, self.options.value); + self.options.title = self.options.values[self.value].title; + self.options.value = self.options.values[self.value].id; + setTitle(); + // fixme: if the tooltip is visible + // we also need to call show() + that.$tooltip && that.$tooltip.options({ + title: self.options.tooltip[self.value] + }); + } else { + self.options.value = !self.options.value; + } + self.options.selectable && setSelected(); + return that; + } + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/ButtonGroup.js b/demo/static/OxJS/dev/Ox.UI/js/Form/ButtonGroup.js new file mode 100644 index 0000000..977638f --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/ButtonGroup.js @@ -0,0 +1,156 @@ +'use strict'; + +/*@ +Ox.ButtonGroup ButtonGroup Object + options Options object + buttons <[o]> array of button options + max integer, maximum number of selected buttons, 0 for all + min integer, minimum number of selected buttons, 0 for none + selectable if true, buttons are selectable + type string, 'image' or 'text' + self Shared private variable + ([options[, self]]) -> ButtonGroup Object + change {id, value} selection within a group changed +@*/ + +Ox.ButtonGroup = function(options, self) { + + self = self || {}; + var that = Ox.Element({}, self) + .defaults({ + buttons: [], + max: 1, + min: 1, + overlap: 'none', + selectable: false, + size: 'medium', + style: 'default', + type: 'text', + value: options.max != 1 ? [] : '' + }) + .options(options || {}) + .update({ + value: function() { + // fixme: this doesn't work in cases where + // multiple buttons can be selected + var position = Ox.getIndexById( + self.options.buttons, self.options.value + ); + if (position > -1) { + self.$buttons[position].trigger('click'); + } else if (self.options.min == 0) { + self.$buttons.forEach(function($button, i) { + $button.options('value') && $button.trigger('click'); + }); + } + } + }) + .addClass( + 'OxButtonGroup' + + (self.options.overlap != 'none' ? ' OxOverlap' + Ox.toTitleCase(self.options.overlap) : '') + ); + + self.options.buttons = self.options.buttons.map(function(button, i) { + return Ox.extend({ + disabled: button.disabled, + id: button.id || button, + overlap: self.options.overlap == 'left' && i == 0 ? 'left' + : self.options.overlap == 'right' && i == self.options.buttons.length - 1 ? 'right' + : 'none', + title: button.title || button, + tooltip: button.tooltip, + width: button.width + }, self.options.selectable ? { + selected: Ox.makeArray(self.options.value).indexOf(button.id || button) > -1 + } : {}); + }); + + if (self.options.selectable) { + self.optionGroup = new Ox.OptionGroup( + self.options.buttons, + self.options.min, + self.options.max, + 'selected' + ); + self.options.buttons = self.optionGroup.init(); + self.options.value = self.optionGroup.value(); + } + + self.$buttons = []; + self.options.buttons.forEach(function(button, pos) { + self.$buttons[pos] = Ox.Button({ + disabled: button.disabled || false, // FIXME: getset should handle undefined + group: true, + id: button.id, + overlap: button.overlap, + selectable: self.options.selectable, + size: self.options.size, + style: self.options.style, + title: button.title, + tooltip: button.tooltip, + type: self.options.type, + value: button.selected || false, // FIXME: getset should handle undefined + width: button.width + }) + .bindEvent(self.options.selectable ? { + change: function() { + toggleButton(pos); + } + } : { + click: function() { + that.triggerEvent('click', {id: button.id}); + } + }) + .appendTo(that); + }); + + function getButtonById(id) { + return self.$buttons[Ox.getIndexById(self.options.buttons, id)]; + } + + function toggleButton(pos) { + var toggled = self.optionGroup.toggle(pos); + if (!toggled.length) { + // FIXME: fix and use that.toggleOption() + self.$buttons[pos].value(!self.$buttons[pos].value()); + } else { + toggled.forEach(function(i) { + i != pos && self.$buttons[i].value(!self.$buttons[i].value()); + }); + self.options.value = self.optionGroup.value(); + that.triggerEvent('change', { + title: self.options.value === '' ? '' + : Ox.isString(self.options.value) + ? Ox.getObjectById(self.options.buttons, self.options.value).title + : self.options.value.map(function(value) { + return Ox.getObjectById(self.options.buttons, value).title; + }), + value: self.options.value + }); + } + } + + /*@ + disableButton Disable button + @*/ + that.disableButton = function(id) { + getButtonById(id).options({disabled: true}); + }; + + /*@ + enableButton Enable button + @*/ + that.enableButton = function(id) { + getButtonById(id).options({disabled: false}); + }; + + /* + buttonOptions Get or set button options + */ + that.buttonOptions = function(id, options) { + return getButtonById(id).options(options); + }; + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/Checkbox.js b/demo/static/OxJS/dev/Ox.UI/js/Form/Checkbox.js new file mode 100644 index 0000000..63568a6 --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/Checkbox.js @@ -0,0 +1,120 @@ +'use strict'; + +/*@ +Ox.Checkbox Checkbox Element + options Options object + disabled if true, checkbox is disabled + group if true, checkbox is part of a group + label Label (on the left side) + labelWidth Label width + title Title (on the right side) + value if true, checkbox is checked + width width in px + self Shared private variable + ([options[, self]]) -> Checkbox Element + change triggered when value changes +@*/ + +Ox.Checkbox = function(options, self) { + + self = self || {}; + var that = Ox.Element({}, self) + .defaults({ + disabled: false, + group: false, + label: '', + labelWidth: 64, + overlap: 'none', + title: '', + value: false, + width: options && (options.label || options.title) ? 'auto' : 16 + }) + .options(options || {}) + .update({ + disabled: function() { + var disabled = self.options.disabled; + that.attr({disabled: disabled}); + self.$button.options({disabled: disabled}); + self.$title && self.$title.options({disabled: disabled}); + }, + title: function() { + self.$title.options({title: self.options.title}); + }, + value: function() { + self.$button.toggle(); + }, + width: function() { + that.css({width: self.options.width + 'px'}); + self.$title && self.$title.options({width: getTitleWidth()}); + } + }) + .addClass('OxCheckbox' + ( + self.options.overlap == 'none' + ? '' : ' OxOverlap' + Ox.toTitleCase(self.options.overlap) + )) + .attr({ + disabled: self.options.disabled + }) + .css(self.options.width != 'auto' ? { + width: self.options.width + } : {}); + + if (self.options.title) { + self.options.width != 'auto' && that.css({ + width: self.options.width + 'px' + }); + self.$title = Ox.Label({ + disabled: self.options.disabled, + id: self.options.id + 'Label', + overlap: 'left', + title: self.options.title, + width: getTitleWidth() + }) + .css({float: 'right'}) + .click(clickTitle) + .appendTo(that); + } + + if (self.options.label) { + self.$label = Ox.Label({ + overlap: 'right', + textAlign: 'right', + title: self.options.label, + width: self.options.labelWidth + }) + .css({float: 'left'}) + .appendTo(that); + } + + self.$button = Ox.Button({ + disabled: self.options.disabled, + id: self.options.id + 'Button', + type: 'image', + value: self.options.value ? 'check' : 'none', + values: ['none', 'check'] + }) + .addClass('OxCheckbox') + .bindEvent({ + change: clickButton + }) + .appendTo(that); + + function clickButton() { + self.options.value = !self.options.value; + that.triggerEvent('change', { + value: self.options.value + }); + } + + function clickTitle() { + !self.options.disabled && self.$button.trigger('click'); + } + + function getTitleWidth() { + return self.options.width - 16 + - !!self.options.label * self.options.labelWidth; + } + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/CheckboxGroup.js b/demo/static/OxJS/dev/Ox.UI/js/Form/CheckboxGroup.js new file mode 100644 index 0000000..5eb8c2b --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/CheckboxGroup.js @@ -0,0 +1,109 @@ +'use strict'; + +/*@ +Ox.CheckboxGroup CheckboxGroup Object + options Options object + checkboxes array of checkboxes + max max selected + min min selected + type type ("group" or "list") + width width in px + self Shared private variable + ([options[, self]]) -> CheckboxGroup Object + change triggered when checked property changes + passes {id, title, value} +@*/ + +Ox.CheckboxGroup = function(options, self) { + + self = self || {}; + var that = Ox.Element({}, self) + .defaults({ + // fixme: should 'checkboxes' be 'items'? + checkboxes: [], + max: 1, + min: 1, + type: 'group', + value: options.max != 1 ? [] : '', + width: 256 + }) + .options(options || {}) + .update({ + width: function() { + self.$checkboxes.forEach(function($checkbox) { + $checkbox.options({width: self.options.width}); + }); + } + }) + .addClass('OxCheckboxGroup Ox' + Ox.toTitleCase(self.options.type)); + + self.options.checkboxes = self.options.checkboxes.map(function(checkbox) { + return { + checked: Ox.makeArray(self.options.value).indexOf(checkbox.id || checkbox) > -1, + id: checkbox.id || checkbox, + title: checkbox.title || checkbox + }; + }); + + self.optionGroup = new Ox.OptionGroup( + self.options.checkboxes, + self.options.min, + self.options.max, + 'checked' + ); + self.options.checkboxes = self.optionGroup.init(); + self.options.value = self.optionGroup.value(); + + self.$checkboxes = []; + if (self.options.type == 'group') { + self.checkboxWidth = Ox.splitInt( + self.options.width + (self.options.checkboxes.length - 1) * 6, + self.options.checkboxes.length + ).map(function(v, i) { + return v + (i < self.options.checkboxes.length - 1 ? 10 : 0); + }); + }; + + self.options.checkboxes.forEach(function(checkbox, pos) { + self.$checkboxes[pos] = Ox.Checkbox(Ox.extend(checkbox, { + group: true, + id: checkbox.id, + width: self.options.type == 'group' + ? self.checkboxWidth[pos] : self.options.width, + value: checkbox.checked + })) + .bindEvent('change', function() { + toggleCheckbox(pos); + }) + .appendTo(that); + }); + + function toggleCheckbox(pos) { + var toggled = self.optionGroup.toggle(pos); + Ox.Log('Form', 'change', pos, 'toggled', toggled) + if (!toggled.length) { + // FIXME: fix and use that.toggleOption() + self.$checkboxes[pos].value(!self.$checkboxes[pos].value()); + } else { + toggled.forEach(function(i) { + i != pos && self.$checkboxes[i].value(!self.$checkboxes[i].value()); + }); + self.options.value = self.optionGroup.value(); + that.triggerEvent('change', { + title: Ox.isString(self.options.value) + ? ( + self.options.value + ? Ox.getObjectById(self.options.checkboxes, self.options.value).title + : '' + ) + : self.options.value.map(function(value) { + return Ox.getObjectById(self.options.checkboxes, value).title; + }), + value: self.options.value + }); + } + } + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/ColorInput.js b/demo/static/OxJS/dev/Ox.UI/js/Form/ColorInput.js new file mode 100644 index 0000000..bda1f44 --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/ColorInput.js @@ -0,0 +1,88 @@ +'use strict'; + +/*@ +Ox.ColorInput ColorInput Element + options Options object + mode Mode ('rgb' or 'hsl') + value <[n]|[0, 0, 0]> Value + self Shared private variable + ([options[, self]]) -> ColorInput Element + change change +@*/ +Ox.ColorInput = function(options, self) { + + self = self || {}; + var that = Ox.Element({}, self) + .defaults({ + mode: 'rgb', + value: options.mode == 'hsl' ? [0, 1, 0.5] : [0, 0, 0] + }) + .options(options || {}); + + self.$inputs = []; + Ox.loop(3, function(i) { + self.$inputs[i] = Ox.Input({ + max: self.options.mode == 'rgb' ? 255 : i == 0 ? 360 : 1, + type: self.options.mode == 'rgb' || i == 0 ? 'int' : 'float', + value: self.options.value[i], + width: 40 + }) + .bindEvent('autovalidate', change); + }); + self.$inputs[3] = Ox.Label({ + width: 40 + }) + .css({ + background: 'rgb(' + getRGB().join(', ') + ')' + }); + self.$inputs[4] = Ox.ColorPicker({ + mode: self.options.mode, + width: 16 + }) + .bindEvent({ + change: function(data) { + self.options.value = data.value; + Ox.loop(3, function(i) { + self.$inputs[i].options({value: self.options.value[i]}); + }); + self.$inputs[3].css({ + background: 'rgb(' + getRGB().join(', ') + ')' + }); + } + }) + .options({ + width: 16 // this is just a hack to make the InputGroup layout work + }); + + that.setElement(Ox.InputGroup({ + inputs: self.$inputs, + separators: [ + {title: ',', width: 8}, + {title: ',', width: 8}, + {title: '', width: 8}, + {title: '', width: 8} + ], + value: Ox.clone(self.options.value) + }) + .bindEvent('change', change) + ); + + function change() { + self.options.value = Ox.range(3).map(function(i) { + return self.$inputs[i].options('value'); + }) + self.$inputs[3].css({ + background: 'rgb(' + getRGB().join(', ') + ')' + }); + that.triggerEvent('change', {value: self.options.value}); + } + + function getRGB() { + return self.options.mode == 'rgb' + ? self.options.value + : Ox.rgb(self.options.value); + } + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/ColorPicker.js b/demo/static/OxJS/dev/Ox.UI/js/Form/ColorPicker.js new file mode 100644 index 0000000..aa92d64 --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/ColorPicker.js @@ -0,0 +1,117 @@ +'use strict'; + +/*@ +Ox.ColorPicker ColorPicker Element + options Options object + mode Mode ('rgb' or 'hsl') + value <[n]|[0, 0, 0]> Value + self Shared private variable + ([options[, self]]) -> ColorPicker Element + change triggered on change of value +@*/ + +Ox.ColorPicker = function(options, self) { + + self = self || {}; + var that = Ox.Element({}, self) + .defaults({ + mode: 'rgb', + value: options && options.mode == 'hsl' ? [0, 1, 0.5] : [0, 0, 0] + }) + .options(options || {}); + + //Ox.Log('Form', self) + self.$ranges = []; + + Ox.loop(3, function(i) { + self.$ranges[i] = Ox.Range({ + arrows: true, + changeOnDrag: true, + id: self.options.id + i, + max: self.options.mode == 'rgb' ? 255 : i == 0 ? 359 : 1, + size: self.options.mode == 'rgb' ? 328 : 432, // 256|360 + 16 + 40 + 16 + step: self.options.mode == 'rgb' || i == 0 ? 1 : 0.01, + thumbSize: 40, + thumbValue: true, + trackColors: getColors(i), + trackGradient: true, + value: self.options.value[i] + }) + .css({ + position: 'absolute', + top: (i * 15) + 'px' + }) + .bindEvent({ + change: function(data) { + change(i, data.value); + } + }) + .appendTo(that); + if (i == 0) { + // fixme: this should go into Ox.UI.css + self.$ranges[i].children('input.OxOverlapRight').css({ + borderRadius: 0 + }); + self.$ranges[i].children('input.OxOverlapLeft').css({ + borderRadius: '0 8px 0 0' + }); + } else { + self.$ranges[i].children('input').css({ + borderRadius: 0 + }); + } + }); + + that = Ox.Picker({ + element: that, + elementHeight: 46, + elementWidth: self.options.mode == 'rgb' ? 328 : 432 + }); + + function change(index, value) { + self.options.value[index] = value; + that.$label.css({ + background: 'rgb(' + getRGB(self.options.value).join(', ') + ')' + }); + Ox.loop(3, function(i) { + if (i != index) { + self.$ranges[i].options({ + trackColors: getColors(i) + }); + } + }); + that.triggerEvent('change', {value: self.options.value}); + } + + function getColors(index) { + return ( + self.options.mode == 'rgb' ? [ + Ox.range(3).map(function(i) { + return i == index ? 0 : self.options.value[i]; + }), + Ox.range(3).map(function(i) { + return i == index ? 255 : self.options.value[i]; + }) + ] + : index == 0 ? Ox.range(7).map(function(i) { + return [i * 60, self.options.value[1], self.options.value[2]]; + }) + : Ox.range(3).map(function(i) { + return [ + self.options.value[0], + index == 1 ? i / 2 : self.options.value[1], + index == 2 ? i / 2 : self.options.value[2] + ]; + }) + ).map(function(values) { + return 'rgb(' + getRGB(values).join(', ') + ')'; + }); + } + + function getRGB(values) { + return self.options.mode == 'rgb' ? values : Ox.rgb(values); + } + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/DateInput.js b/demo/static/OxJS/dev/Ox.UI/js/Form/DateInput.js new file mode 100644 index 0000000..3ce5f4d --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/DateInput.js @@ -0,0 +1,216 @@ +'use strict'; + +/*@ +Ox.DateInput DateInput Element + options Options object + format format can be short, medium, long + value date value, defaults to current date + weekday weekday + width width of individual input elements, in px + day width of day input element + month width of month input element + weekday width of weekday input element + year width of year input element + self Shared private variable + ([options[, self]]) -> DateInput Element + change triggered on change of value +@*/ +Ox.DateInput = function(options, self) { + + var that; + self = Ox.extend(self || {}, { + options: Ox.extend({ + format: 'short', + value: Ox.formatDate(new Date(), '%F'), + weekday: false, + width: { + day: 32, + month: options && options.format == 'long' ? 80 + : options && options.format == 'medium' ? 40 : 32, + weekday: options && options.format == 'long' ? 80 : 40, + year: 48 + } + }, options || {}) + }); + + self.formats = { + day: '%d', + month: self.options.format == 'short' ? '%m' : + (self.options.format == 'medium' ? '%b' : '%B'), + weekday: self.options.format == 'long' ? '%A' : '%a', + year: '%Y' + }; + self.months = self.options.format == 'long' ? Ox.MONTHS : Ox.SHORT_MONTHS; + self.weekdays = self.options.format == 'long' ? Ox.WEEKDAYS : Ox.SHORT_WEEKDAYS; + + self.$input = Ox.extend(self.options.weekday ? { + weekday: Ox.Input({ + autocomplete: self.weekdays, + autocompleteReplace: true, + autocompleteReplaceCorrect: true, + id: 'weekday', + width: self.options.width.weekday + }) + .bindEvent('autocomplete', changeWeekday) + } : {}, { + day: Ox.Input({ + autocomplete: Ox.range(1, Ox.getDaysInMonth( + parseInt(Ox.formatDate(self.date, '%Y'), 10), + parseInt(Ox.formatDate(self.date, '%m'), 10) + ) + 1).map(function(i) { + return self.options.format == 'short' ? Ox.pad(i, 2) : i.toString(); + }), + autocompleteReplace: true, + autocompleteReplaceCorrect: true, + id: 'day', + textAlign: 'right', + width: self.options.width.day + }) + .bindEvent('autocomplete', changeDay), + month: Ox.Input({ + autocomplete: self.options.format == 'short' ? Ox.range(1, 13).map(function(i) { + return Ox.pad(i, 2); + }) : self.months, + autocompleteReplace: true, + autocompleteReplaceCorrect: true, + id: 'month', + textAlign: self.options.format == 'short' ? 'right' : 'left', + width: self.options.width.month + }) + .bindEvent('autocomplete', changeMonthOrYear), + year: Ox.Input({ + autocomplete: Ox.range(1900, 3000).concat(Ox.range(1000, 1900)).map(function(i) { + return i.toString(); + }), + autocompleteReplace: true, + autocompleteReplaceCorrect: true, + id: 'year', + textAlign: 'right', + width: self.options.width.year + }) + .bindEvent('autocomplete', changeMonthOrYear) + }); + + that = Ox.InputGroup(Ox.extend(self.options, { + id: self.options.id, + inputs: [].concat(self.options.weekday ? [ + self.$input.weekday + ] : [], self.options.format == 'short' ? [ + self.$input.year, self.$input.month, self.$input.day + ] : [ + self.$input.month, self.$input.day, self.$input.year + ]), + join: join, + separators: [].concat(self.options.weekday ? [ + {title: self.options.format == 'short' ? '' : ',', width: 8}, + ] : [], self.options.format == 'short' ? [ + {title: '-', width: 8}, {title: '-', width: 8} + ] : [ + {title: '', width: 8}, {title: ',', width: 8} + ]), + split: split, + width: 0 + }), self); + + function changeDay() { + self.options.weekday && self.$input.weekday.value( + Ox.formatDate(new Date([ + self.$input.month.value(), + self.$input.day.value(), + self.$input.year.value() + ].join(' ')), self.formats.weekday) + ); + self.options.value = join(); + } + + function changeMonthOrYear() { + var day = self.$input.day.value(), + month = self.$input.month.value(), + year = self.$input.year.value(), + days = Ox.getDaysInMonth(year, self.options.format == 'short' ? parseInt(month, 10) : month); + day = day <= days ? day : days; + //Ox.Log('Form', year, month, 'day days', day, days) + self.options.weekday && self.$input.weekday.value( + Ox.formatDate( + new Date([month, day, year].join(' ')), + self.formats.weekday + ) + ); + self.$input.day.options({ + autocomplete: Ox.range(1, days + 1).map(function(i) { + return self.options.format == 'short' ? Ox.pad(i, 2) : i.toString(); + }), + value: self.options.format == 'short' ? Ox.pad(parseInt(day, 10), 2) : day.toString() + }); + self.options.value = join(); + } + + function changeWeekday() { + var date = getDateInWeek( + self.$input.weekday.value(), + self.$input.month.value(), + self.$input.day.value(), + self.$input.year.value() + ); + self.$input.month.value(date.month); + self.$input.day.options({ + autocomplete: Ox.range(1, Ox.getDaysInMonth(date.year, date.month) + 1).map(function(i) { + return self.options.format == 'short' ? Ox.pad(i, 2) : i.toString(); + }), + value: date.day + }); + self.$input.year.value(date.year); + self.options.value = join(); + } + + function getDate(value) { + return new Date(self.options.value.replace(/-/g, '/')); + } + + function getDateInWeek(weekday, month, day, year) { + //Ox.Log('Form', [month, day, year].join(' ')) + var date = new Date([month, day, year].join(' ')); + date = Ox.getDateInWeek(date, weekday); + return { + day: Ox.formatDate(date, self.formats.day), + month: Ox.formatDate(date, self.formats.month), + year: Ox.formatDate(date, self.formats.year) + }; + } + + function getValues() { + var date = getDate(); + return { + day: Ox.formatDate(date, self.formats.day), + month: Ox.formatDate(date, self.formats.month), + weekday: Ox.formatDate(date, self.formats.weekday), + year: Ox.formatDate(date, self.formats.year) + }; + } + + function join() { + return Ox.formatDate(new Date(self.options.format == 'short' ? [ + self.$input.year.value(), + self.$input.month.value(), + self.$input.day.value() + ].join('/') : [ + self.$input.month.value(), + self.$input.day.value(), + self.$input.year.value() + ].join(' ')), '%F'); + } + + function split() { + var values = getValues(); + return [].concat(self.options.weekday ? [ + values.weekday + ] : [], self.options.format == 'short' ? [ + values.year, values.month, values.day + ] : [ + values.month, values.day, values.year + ]); + } + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/DateTimeInput.js b/demo/static/OxJS/dev/Ox.UI/js/Form/DateTimeInput.js new file mode 100644 index 0000000..cd460bb --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/DateTimeInput.js @@ -0,0 +1,70 @@ +'use strict'; + +/*@ +Ox.DateTimeInput DateTimeInput Element + options Options object + ampm false is 24h true is am/pm + format options are short, medium, long + seconds show seconds + value defautls to now + weekday weekday + self Shared private variable + ([options[, self]]) -> DateTimeInput Element + change triggered on change of value +@*/ + +Ox.DateTimeInput = function(options, self) { + + var that; + self = Ox.extend(self || {}, { + options: Ox.extend({ + ampm: false, + format: 'short', + milliseconds: false, + seconds: false, + value: (function() { + var date = new Date(); + return Ox.formatDate( + date, + '%F ' + (options && (options.seconds || options.milliseconds) ? '%T' : '%H:%M') + ) + (options && options.milliseconds ? '.' + Ox.pad(date % 1000, 3) : ''); + }()), + weekday: false + }, options || {}) + }); + + self.options.seconds = self.options.seconds || self.options.milliseconds; + + that = Ox.InputGroup(Ox.extend(self.options, { + inputs: [ + Ox.DateInput({ + format: self.options.format, + id: 'date', + weekday: self.options.weekday + }), + Ox.TimeInput({ + ampm: self.options.ampm, + id: 'time', + seconds: self.options.seconds + }) + ], + join: join, + separators: [ + {title: '', width: 8} + ], + split: split + }), self); + + function join() { + return that.options('inputs').map(function($input) { + return $input.value(); + }).join(' '); + } + + function split() { + return self.options.value.split(' '); + } + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/Editable.js b/demo/static/OxJS/dev/Ox.UI/js/Form/Editable.js new file mode 100644 index 0000000..1781a17 --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/Editable.js @@ -0,0 +1,294 @@ +'use strict'; + +/*@ +Ox.Editable Editable element + options Options object + editing If true, loads in editing state + format Format function + (value) -> Formatted value + value Input value + self Shared private variable + ([options[, self]]) -> Input Element + blur blur + cancel cancel + edit edit + open open + submit submit +@*/ +Ox.Editable = function(options, self) { + + self = self || {}; + var that = Ox.Element({ + element: options.type == 'textarea' ? '
' : '', + tooltip: options.tooltip + }, self) + .defaults({ + blurred: false, + clickLink: null, + editable: true, + editing: false, + format: null, + height: 0, + highlight: null, + maxHeight: void 0, + placeholder: '', + replaceTags: {}, + submitOnBlur: true, + tags: null, + tooltip: '', + type: 'input', + value: '', + width: 0 + }) + .options(options || {}) + .update({ + editing: function() { + if (self.options.editing) { + // edit will toggle self.options.editing + self.options.editing = false; + edit(); + } else { + submit(); + } + }, + height: function() { + setCSS({height: self.options.height + 'px'}); + }, + width: function() { + setCSS({width: self.options.width + 'px'}); + }, + highlight: function() { + self.$value.html(formatValue()); + }, + placeholder: function() { + self.$value.html(formatValue()); + }, + value: function() { + self.$value.html(formatValue()); + } + }) + .addClass('OxEditableElement' + (self.options.editable ? ' OxEditable' : '')) + .on({ + click: function(e) { + var $target = $(e.target); + if (!e.shiftKey && ($target.is('a') || ($target = $target.parents('a')).length)) { + e.preventDefault(); + if (self.options.clickLink) { + e.target = $target[0]; + self.options.clickLink(e); + } else { + document.location.href = $target.attr('href'); + } + } + return false; + } + }) + .bindEvent({ + doubleclick: edit, + singleclick: function(e) { + } + }); + + self.options.value = self.options.value.toString(); + + self.css = {}; + self.$value = Ox.Element(self.options.type == 'input' ? '' : '
') + .addClass('OxValue') + .html(formatValue()) + .appendTo(that); + + if (self.options.editing) { + // need timeout so that when determining height + // the element is actually in the DOM + setTimeout(function() { + // edit will toggle self.options.editing + self.options.editing = false; + edit(); + }); + } + + function blur(data) { + self.options.value = parseValue(); + if (self.options.value !== self.originalValue) { + self.originalValue = self.options.value; + that.triggerEvent('change', {value: self.options.value}); + } + that.triggerEvent('blur', data); + } + + function cancel() { + self.options.editing = false; + that.removeClass('OxEditing'); + self.options.value = self.originalValue; + self.$input.value(formatInputValue()).hide(); + self.$test.html(formatTestValue()); + self.$value.html(formatValue()).show(); + that.triggerEvent('cancel', {value: self.options.value}); + } + + function change(data) { + self.options.value = parseValue(data.value); + self.$value.html(formatValue()); + self.$test.html(formatTestValue()); + setSizes(); + } + + function edit() { + var height, width; + if (self.options.editable && !self.options.editing) { + self.options.editing = true; + that.addClass('OxEditing'); + self.originalValue = self.options.value; + if (!self.$input) { + self.$input = Ox.Input({ + changeOnKeypress: true, + element: self.options.type == 'input' ? '' : '
', + style: 'square', + type: self.options.type, + value: formatInputValue() + }) + .css(self.css) + .bindEvent({ + blur: self.options.submitOnBlur ? submit : blur, + cancel: cancel, + change: change, + insert: function(data) { + that.triggerEvent('insert', data); + }, + submit: submit + }) + .appendTo(that); + self.$input.find('input').css(self.css); + self.$test = self.$value.$element.clone() + .css(Ox.extend({display: 'inline-block'}, self.css)) + .html(formatTestValue()) + .css({background: 'rgb(192, 192, 192)'}) + .appendTo(that); + } + self.minWidth = 8; + self.maxWidth = that.parent().width(); + self.minHeight = 13; + self.maxHeight = self.options.type == 'input' + ? self.minHeight + : self.options.maxHeight || that.parent().height(); + setSizes(); + self.$value.hide(); + self.$input.show(); + if (!self.options.blurred) { + setTimeout(function() { + self.$input.focusInput(self.options.type == 'input'); + }, 0); + that.$tooltip && that.$tooltip.options({title: ''}); + that.triggerEvent('edit'); + } + } else if (!self.options.editable) { + that.triggerEvent('open'); + } + self.options.blurred = false; + } + + function formatInputValue() { + return Ox.decodeHTMLEntities( + self.options.type == 'input' + ? self.options.value + : self.options.value.replace(//g, '\n\n') + ); + } + + function formatTestValue() { + var value = Ox.encodeHTMLEntities(self.$input.options('value')); + return !value ? ' ' + : self.options.type == 'input' + ? value.replace(/ /g, ' ') + : value.replace(/\n$/, '\n ') + .replace(/ /g, '  ') + .replace(/(^ | $)/, ' ') + .replace(/\n/g, '
') + } + + function formatValue() { + var value = self.options.value; + that.removeClass('OxPlaceholder'); + if (self.options.value === '' && self.options.placeholder) { + value = self.options.placeholder; + that.addClass('OxPlaceholder'); + } else if (self.options.format) { + value = self.options.format(self.options.value); + } + if (self.options.highlight) { + value = Ox.highlight( + value, self.options.highlight, 'OxHighlight', true + ); + } + return value; + } + + function parseValue() { + var value = Ox.clean( + self.$input.value().replace(/\n\n+/g, '\0') + ).replace(/\0/g, '\n\n').trim(); + return ( + self.options.type == 'input' + ? Ox.encodeHTMLEntities(value) + : Ox.sanitizeHTML(value, self.options.tags, self.options.replaceTags) + ); + } + + function setCSS(css) { + self.$test && self.$test.css(css); + self.$input && self.$input.css(css); + self.$input && self.$input.find(self.options.type).css(css); + } + + function setSizes() { + var height, width; + self.$test.css({display: 'inline-block'}); + height = self.options.height || Ox.limit(self.$test.height(), self.minHeight, self.maxHeight); + width = self.$test.width(); + // +Ox.UI.SCROLLBAR_SIZE to prevent scrollbar from showing up + if (self.options.type == 'textarea') { + width += Ox.UI.SCROLLBAR_SIZE; + } + width = self.options.width || Ox.limit(width, self.minWidth, self.maxWidth); + self.$test.css({display: 'none'}); + /* + that.css({ + width: width + 'px', + height: height + 'px' + }); + */ + self.$input.options({ + width: width, + height: height + }); + self.$input.find(self.options.type).css({ + width: width + 'px', + height: height + 'px' + }); + } + + function submit() { + self.options.editing = false; + that.removeClass('OxEditing'); + self.$input.value(formatInputValue()).hide(); + self.$test.html(formatTestValue()); + self.$value.html(formatValue()).show(); + that.$tooltip && that.$tooltip.options({title: self.options.tooltip}); + that.triggerEvent('submit', {value: self.options.value}); + } + + /*@ + css css + @*/ + that.css = function(css) { + self.css = css; + that.$element.css(css); + self.$value.css(css); + self.$test && self.$test.css(css); + self.$input && self.$input.css(css); + return that; + }; + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/EditableContent.js b/demo/static/OxJS/dev/Ox.UI/js/Form/EditableContent.js new file mode 100644 index 0000000..6d94c1d --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/EditableContent.js @@ -0,0 +1,216 @@ +Ox.EditableContent = function(options, self) { + + self = self || {}; + if (options.tooltip) { + self.tooltip = options.tooltip; + options.tooltip = function(e) { + return that.hasClass('OxEditing') ? '' + : Ox.isString(self.tooltip) ? self.tooltip + : self.tooltip(e); + } + } + var that = Ox.Element(options.type == 'textarea' ? '
' : '', self) + .defaults({ + clickLink: null, + editable: true, + editing: false, + format: null, + highlight: null, + placeholder: '', + replaceTags: {}, + submitOnBlur: true, + tags: null, + tooltip: '', + type: 'input', + value: '' + }) + .options(options || {}) + .update({ + editing: function() { + if (self.options.editing) { + // edit will toggle self.options.editing + self.options.editing = false; + edit(); + } else { + submit(); + } + }, + highlight: function() { + !self.options.editing && self.$value.html(formatValue()); + }, + value: function() { + !self.options.editing && self.$value.html(formatValue()); + } + }) + .addClass('OxEditableContent') + .on({ + blur: self.options.submitOnBlur ? submit : blur, + click: function(e) { + var $target = $(e.target); + if (!e.shiftKey && ($target.is('a') || ($target = $target.parents('a')).length)) { + e.preventDefault(); + if (self.options.clickLink) { + e.target = $target[0]; + self.options.clickLink(e); + } else { + document.location.href = $target.attr('href'); + } + } + return false; + }, + keydown: function(e) { + if (e.keyCode == 13) { + if (e.shiftKey || self.options.type == 'input') { + submit(); + } else { + var selection = window.getSelection(), + node = selection.anchorNode, + offset = selection.anchorOffset, + range = document.createRange(), + text = node.textContent; + e.preventDefault(); + node.textContent = text.substr(0, offset) + + '\n' + (text.substr(offset) || ' '); + range.setStart(node, offset + 1); + range.setEnd(node, offset + 1); + selection.removeAllRanges(); + selection.addRange(range); + } + return false; + } else if (e.keyCode == 27) { + cancel(); + return false; + } + setTimeout(function() { + that.css({padding: that.text() ? 0 : '0 2px'}); + }); + }, + paste: function(e) { + Ox.print('PASTE', e); + } + }) + .bindEvent({ + doubleclick: edit + }); + + self.options.value = self.options.value.toString(); + + that.html(formatValue()); + + if (self.options.editing) { + // wait for the element to be in the DOM + setTimeout(function() { + // edit will toggle self.options.editing + self.options.editing = false; + edit(); + }); + } + + function blur() { + // ... + } + + function cancel() { + if (self.options.editing) { + that.loseFocus(); + self.options.editing = false; + that.removeClass('OxEditing') + .attr({contenteditable: false}) + .html(formatValue()); + if (self.options.type == 'input') { + that.css({padding: 0}); + } + that.triggerEvent('cancel', {value: self.options.value}); + } + } + + function edit() { + if (self.options.editable && !self.options.editing) { + var value = formatInputValue(); + that.$tooltip && that.$tooltip.remove(); + that.addClass('OxEditing') + .removeClass('OxPlaceholder') + .attr({contenteditable: true}); + if (value) { + that.text(value); + } else { + that.text(''); + if (self.options.type == 'input') { + that.css({padding: '0 2px'}); + } + } + self.options.editing = true; + that.gainFocus(); + setTimeout(updateSelection); + that.triggerEvent('edit'); + } else if (!self.options.editable) { + that.triggerEvent('open'); + } + } + + function formatInputValue() { + return Ox.decodeHTMLEntities( + self.options.type == 'input' + ? self.options.value + : self.options.value.replace(//g, '\n\n') + ); + } + + function formatValue() { + var value = self.options.value; + that.removeClass('OxPlaceholder'); + if (self.options.value === '' && self.options.placeholder) { + value = self.options.placeholder; + that.addClass('OxPlaceholder'); + } else if (self.options.format) { + value = self.options.format(self.options.value); + } + if (self.options.highlight) { + value = Ox.highlight( + value, self.options.highlight, 'OxHighlight', true + ); + } + return value; + } + + function parseValue() { + var value = Ox.clean( + that.text().replace(/\n\n+/g, '\0') + ).replace(/\0/g, '\n\n').trim(); + return ( + self.options.type == 'input' + ? Ox.encodeHTMLEntities(value) + : Ox.sanitizeHTML(value, self.options.tags, self.options.replaceTags) + ); + } + + function submit() { + if (self.options.editing) { + that.loseFocus(); + self.options.editing = false; + self.options.value = parseValue(); + that.removeClass('OxEditing') + .attr({contenteditable: false}) + .html(formatValue()); + if (self.options.type == 'input') { + that.css({padding: 0}); + } + that.triggerEvent('submit', {value: self.options.value}); + } + } + + function updateSelection() { + var range = document.createRange(), + selection = window.getSelection(); + that.$element[0].focus(); + selection.removeAllRanges(); + range.selectNodeContents(that.$element[0]); + selection.addRange(range); + setTimeout(function() { + selection.collapseToEnd(); + }); + } + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/FileButton.js b/demo/static/OxJS/dev/Ox.UI/js/Form/FileButton.js new file mode 100644 index 0000000..d972c08 --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/FileButton.js @@ -0,0 +1,140 @@ +'use strict'; + +/*@ +Ox.FileButton File Button + options Options + disabled If true, the button is disabled + image Symbol name (if type is 'image') + The default value will be 'files' if maxFiles is not 1 + maxFiles Maximum number of files (or -1 for unlimited) + maxSize Maximum total file size in bytes (or -1 for unlimited) + title Title of the button (and its tooltip) + type Type of the button ('text' or 'image') + width Width of the button in px + self Shared private variable + ([options[, self]]) -> File Button + click click +@*/ +Ox.FileButton = function(options, self) { + + self = self || {}; + var that = Ox.Element({}, self) + .defaults({ + disabled: false, + image: options && options.maxFiles == 1 ? 'file' : 'files', + maxFiles: -1, + maxSize: -1, + style: 'default', + title: '', + type: 'text', + width: options.type == 'image' ? 16 : 256 + }) + .options(options || {}) + .update({ + disabled: function() { + self.$button.options({disabled: self.options.disabled}); + self.$input[self.options.disabled ? 'hide' : 'show'](); + }, + title: function() { + self.$button.options({title: self.options.title}); + } + }) + .addClass('OxFileButton') + .css({overflow: 'hidden'}); + + self.files = []; + self.multiple = self.options.maxFiles != 1; + + self.$button = Ox.Button({ + disabled: self.options.disabled, + style: self.options.style, + title: self.options.type == 'image' + ? self.options.image + : self.options.title, + type: self.options.type, + width: self.options.type == 'image' + ? 'auto' + : self.options.width + }) + .css({ + float: 'left' + }) + .appendTo(that); + + self.$input = renderInput(); + self.options.disabled && self.$input.hide(); + + function selectFiles(e) { + var filelist = e.target.files, + files = []; + self.files = []; + Ox.loop(filelist.length, function(i) { + files.push(filelist.item(i)); + }); + files.sort(self.options.maxSize == -1 ? function(a, b) { + a = a.name.toLowerCase(); + b = b.name.toLowerCase(); + return a < b ? -1 : a > b ? 1 : 0; + } : function(a, b) { + // if there's a max size, + // try to add small files first + return a.size - b.size; + }).forEach(function(file) { + if (( + self.options.maxFiles == -1 + || self.files.length < self.options.maxFiles + ) && ( + self.options.maxSize == -1 + || self.size + file.size < self.options.maxSize + )) { + self.files.push(file); + self.size += file.size; + } + }); + self.$input = renderInput(); + if (self.files.length) { + that.triggerEvent('click', {files: self.files}); + } + } + + function renderInput() { + self.$input && self.$input.remove(); + return $('') + .attr( + Ox.extend({ + title: self.options.title, + type: 'file' + }, self.multiple ? { + multiple: true + } : {}) + ) + .css({ + float: 'left', + width: self.options.width + 'px', + height: '16px', + marginLeft: -self.options.width + 'px', + opacity: 0 + }) + .on({ + change: selectFiles + }) + .appendTo(that); + } + + /*@ + blurButton blurButton + @*/ + that.blurButton = function() { + self.$input.blur(); + } + + /*@ + focusButton focusButton + @*/ + that.focusButton = function() { + self.$input.focus(); + }; + + return that; + +} diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/FileInput.js b/demo/static/OxJS/dev/Ox.UI/js/Form/FileInput.js new file mode 100644 index 0000000..9388027 --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/FileInput.js @@ -0,0 +1,310 @@ +'use strict'; + +/*@ +Ox.FileInput File Input + options Options + disabled If true, the element is disabled + maxFiles Maximum number of files (or -1 for unlimited) + maxLines Maximum number of lines to display (or -1 for unlimited) + maxSize Maximum total file size in bytes (or -1 for unlimited) + value Value (array of file objects) + width Width in px + self Shared private variable + ([options[, self]]) -> File Input + change change +@*/ + +Ox.FileInput = function(options, self) { + + self = self || {}; + var that = Ox.Element({}, self) + .defaults({ + disabled: false, + maxFiles: -1, + maxLines: -1, + maxSize: -1, + value: [], + width: 256 + }) + .options(options || {}) + .update({ + disabled: function() { + that[self.options.disabled ? 'addClass' : 'removeClass']('OxDisabled'); + self.$button.options({disabled: self.options.disabled}); + self.$input && self.$input[self.options.disabled ? 'hide' : 'show'](); + } + }) + .addClass('OxFileInput' + (self.options.disabled ? ' OxDisabled' : '')) + .css({width: self.options.width + 'px'}); + + self.multiple = self.options.maxFiles != 1; + self.size = getSize(); + + self.$bar = Ox.Bar({size: 14}) + .css( + Ox.extend({ + width: self.options.width - 2 + 'px' + }, self.multiple && self.options.value.length ? { + borderBottomLeftRadius: 0, + borderBottomRightRadius: 0 + } : {}) + ) + .appendTo(that); + + self.$title = $('
') + .css({ + float: 'left', + width: self.options.width - 102 + 'px', + paddingLeft: '4px', + overflow: 'hidden', + textOverflow: 'ellipsis' + }) + .html(getTitleText()) + .appendTo(self.$bar); + + self.$size = $('
') + .css({ + float: 'left', + width: '64px', + height: '14px', + paddingRight: '16px', + textAlign: 'right' + }) + .html(getSizeText()) + .appendTo(self.$bar); + + self.$button = Ox.Button({ + disabled: self.options.disabled, + style: 'symbol', + title: self.multiple || self.options.value.length == 0 + ? 'add' : 'close', + type: 'image' + }) + .attr({ + title: self.multiple || self.options.value.length == 0 + ? '' : 'Clear' + }) + .css({ + float: 'left', + marginTop: '-1px' + }) + .bindEvent({ + click: clearFile + }) + .appendTo(self.$bar); + + if (self.multiple || self.options.value.length == 0) { + self.$input = renderInput(); + self.options.disabled && self.$input.hide(); + } + + if (self.multiple) { + self.$files = $('
') + .addClass('OxFiles') + .css({ + width: self.options.width - 2 + 'px', + height: getHeight() + }) + .appendTo(that); + self.options.value.length == 0 && self.$files.hide(); + self.$list = Ox.TableList({ + columns: [ + { + id: 'name', + visible: true, + width: self.options.width - 94 + }, + { + align: 'right', + format: function(value) { + return Ox.formatValue(value, 'B'); + }, + id: 'size', + visible: true, + width: 64 + }, + { + align: 'right', + format: function(value, data) { + return Ox.Button({ + style: 'symbol', + title: 'close', + type: 'image' + }) + .attr({title: Ox._('Remove File')}) + .css({margin: '-1px -4px 0 0'}) + .bindEvent({ + click: function() { + self.$list.options({selected: [value]}); + removeFiles([value]); + } + }); + }, + id: 'id', + visible: true, + width: 28 + } + ], + items: getItems(), + sort: [{key: 'name', operator: '+'}], + unique: 'id' + }) + .css({ + left: 0, + top: 0, + width: self.options.width - 2 + 'px', + height: '64px' + }) + .bindEvent({ + 'delete': function(data) { + removeFiles(data.ids); + } + }) + .appendTo(self.$files); + } + + function addFiles(e) { + var filelist = e.target.files, + files = []; + Ox.loop(filelist.length, function(i) { + files.push(filelist.item(i)); + }); + files.sort(self.options.maxSize == -1 ? function(a, b) { + a = a.name.toLowerCase(); + b = b.name.toLowerCase(); + return a < b ? -1 : a > b ? 1 : 0; + } : function(a, b) { + // if there is a max size, + // try to add small files first + return a.size - b.size; + }).forEach(function(file) { + if (!exists(file) && ( + self.options.maxFiles == -1 + || self.options.value.length < self.options.maxFiles + ) && ( + self.options.maxSize == -1 + || self.size + file.size < self.options.maxSize + )) { + self.options.value.push(file); + self.size += file.size; + } + }); + self.$title.html(getTitleText()); + self.$size.html(getSizeText()); + if (self.multiple) { + self.$bar.css({ + borderBottomLeftRadius: 0, + borderBottomRightRadius: 1 + }); + self.$files.css({height: getHeight()}).show(); + self.$list.options({items: getItems()}); + if ( + self.options.value.length == self.options.maxFiles + || self.size == self.options.maxSize + ) { + self.$button.options({disabled: true}); + } + self.$input = renderInput(); + } else { + self.$button.options({title: 'close'}).attr({title: Ox._('Clear')}); + self.$input.remove(); + } + that.triggerEvent('change', {value: self.options.value}); + } + + function clearFile() { + self.options.value = []; + self.size = 0; + self.$title.html(getTitleText()); + self.$size.html(getSizeText()); + self.$button.options({title: 'add'}).attr({title: ''}); + self.$input = renderInput(); + that.triggerEvent('change', {value: self.options.value}); + } + + function exists(file) { + return self.options.value.some(function(f) { + return f.name == file.name + && f.size == file.size + && Ox.isEqual(f.lastModifiedDate, file.lastModifiedDate); + }); + } + + function getHeight() { + return ( + self.options.maxLines == -1 + ? self.options.value.length + : Math.min(self.options.value.length, self.options.maxLines) + ) * 16 + 'px'; + } + + function getItems() { + return self.options.value.map(function(file, i) { + return {name: file.name, size: file.size, id: i}; + }); + } + + function getSize() { + return self.options.value.reduce(function(prev, curr) { + return prev + curr.size; + }, 0); + } + + function getSizeText() { + return self.size ? Ox.formatValue(self.size, 'B') : ''; + } + + function getTitleText() { + var length = self.options.value.length + return length == 0 + ? Ox._('No file' + (self.multiple ? 's' : '') + ' selected') + : self.multiple + ? Ox.formatCount(length, Ox._('file'), Ox._('files')) + : self.options.value[0].name; + } + + function removeFiles(ids) { + self.options.value = self.options.value.filter(function(v, i) { + return ids.indexOf(i) == -1; + }); + self.size = getSize(); + if (self.options.value.length == 0) { + self.$bar.css({ + borderBottomLeftRadius: '8px', + borderBottomRightRadius: '8px' + }); + self.$files.hide(); + } + self.$title.html(getTitleText()); + self.$size.html(getSizeText()); + self.$list.options({items: getItems(), selected: []}); + self.$files.css({height: getHeight()}); + that.triggerEvent('change', {value: self.options.value}); + } + + function renderInput() { + self.$input && self.$input.remove(); + return $('') + .attr( + Ox.extend({ + title: self.multiple ? Ox._('Add Files') : Ox._('Select File'), + type: 'file' + }, self.multiple ? { + multiple: true + } : {}) + ) + .css({ + float: 'left', + width: '16px', + height: '14px', + margin: '-1px -7px 0 -16px', + opacity: 0 + }) + .on({ + change: addFiles + }) + .appendTo(self.$bar); + } + + return that; +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/Filter.js b/demo/static/OxJS/dev/Ox.UI/js/Form/Filter.js new file mode 100644 index 0000000..2888070 --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/Filter.js @@ -0,0 +1,842 @@ +'use strict'; + +/*@ +Ox.Filter Filter Object + options Options object + findKeys <[]|[]> keys + list list object + sort List sort + view List view + query query object + conditions <[o]> Conditions (array of {key, value, operator}) + operator Operator ('&' or '|') + limit Limit + key Limit key + sort Limit sort + value Limit value + sortKeys keys to sort by + viewKeys visible keys + self Shared private variable + ([options[, self]]) -> Filter Object + change change +@*/ + +Ox.Filter = function(options, self) { + + self = self || {}; + var that = Ox.Element({}, self) + .defaults({ + findKeys: [], + list: null, + query: { + conditions: [], + operator: '&' + }, + sortKeys: [], + viewKeys: [] + }) + .options(options || {}); + + // fixme: this should not happen, but some lists + // have their query set to {} or their query operator set to '' + if (Ox.isEmpty(self.options.query)) { + self.options.query = {conditions: [], operator: '&'}; + } else if (self.options.query.operator == '') { + self.options.query.operator = '&'; + } + Ox.Log('Form', 'Ox.Filter self.options', self.options); + + self.conditionOperators = { + boolean: [ + {id: '=', title: Ox._('is')}, + {id: '!=', title: Ox._('is not')} + ], + date: [ + {id: '=', title: Ox._('is')}, + {id: '!=', title: Ox._('is not')}, + {id: '<', title: Ox._('is before')}, + {id: '!<', title: Ox._('is not before')}, + {id: '>', title: Ox._('is after')}, + {id: '!>', title: Ox._('is not after')}, + {id: '=,', title: Ox._('is between')}, + {id: '!=,', title: Ox._('is not between')} + ], + 'enum': [ + {id: '=', title: Ox._('is')}, + {id: '!=', title: Ox._('is not')}, + {id: '<', title: Ox._('is less than')}, + {id: '!<', title: Ox._('is not less than')}, + {id: '>', title: Ox._('is greater than')}, + {id: '!>', title: Ox._('is not greater than')}, + {id: '=,', title: Ox._('is between')}, + {id: '!=,', title: Ox._('is not between')} + ], + list: [ + {id: '==', title: Ox._('is')}, + {id: '!==', title: Ox._('is not')} + ], + number: [ + {id: '=', title: Ox._('is')}, + {id: '!=', title: Ox._('is not')}, + {id: '<', title: Ox._('is less than')}, + {id: '!<', title: Ox._('is not less than')}, + {id: '>', title: Ox._('is greater than')}, + {id: '!>', title: Ox._('is not greater than')}, + {id: '=,', title: Ox._('is between')}, + {id: '!=,', title: Ox._('is not between')} + ], + string: [ + {id: '==', title: Ox._('is')}, + {id: '!==', title: Ox._('is not')}, + {id: '=', title: Ox._('contains')}, + {id: '!=', title: Ox._('does not contain')}, + {id: '^', title: Ox._('starts with')}, + {id: '!^', title: Ox._('does not start with')}, + {id: '$', title: Ox._('ends with')}, + {id: '!$', title: Ox._('does not end with')} + ], + text: [ + {id: '=', title: Ox._('contains')}, + {id: '!=', title: Ox._('does not contain')} + ], + year: [ + {id: '==', title: Ox._('is')}, + {id: '!==', title: Ox._('is not')}, + {id: '<', title: Ox._('is before')}, + {id: '!<', title: Ox._('is not before')}, + {id: '>', title: Ox._('is after')}, + {id: '!>', title: Ox._('is not after')}, + {id: '=,', title: Ox._('is between')}, + {id: '!=,', title: Ox._('is not between')} + ] + }; + self.defaultValue = { + boolean: 'true', + date: Ox.formatDate(new Date(), '%F'), + 'enum': 0, + float: 0, + hue: 0, + integer: 0, + list: '', + string: '', + text: '', + time: '00:00:00', + year: new Date().getFullYear().toString() + }; + self.operators = [ + {id: '&', title: Ox._('all')}, + {id: '|', title: Ox._('any')} + ]; + + if (!self.options.query.conditions.length) { + self.options.query.conditions = [{ + key: self.options.findKeys[0].id, + value: '', + operator: self.conditionOperators[ + getConditionType(self.options.findKeys[0].type) + ][0].id + }]; + } + + self.$operator = Ox.FormElementGroup({ + elements: [ + Ox.Label({ + title: Ox._('Match'), + overlap: 'right', + width: 48 + }), + Ox.FormElementGroup({ + elements: [ + Ox.Select({ + items: self.operators, + value: self.options.query.operator, + width: 48 + }) + .bindEvent({ + change: changeOperator + }), + Ox.Label({ + overlap: 'left', + title: Ox._('of the following conditions'), + width: 160 + }) + ], + float: 'right', + width: 208 + }) + ], + float: 'left' + }); + + self.$save = Ox.InputGroup({ + inputs: [ + self.$foo = Ox.Checkbox({ + width: 16 + }), + Ox.Input({ + id: 'list', + placeholder: Ox._('Untitled'), + width: 128 + }) + ], + separators: [ + {title: Ox._('Save as Smart List'), width: 112} + ] + }); + + self.$limit = Ox.InputGroup({ + inputs: [ + Ox.Checkbox({ + width: 16 + }), + Ox.FormElementGroup({ + elements: [ + Ox.Input({ + type: 'int', + width: 56 + }), + Ox.Select({ + items: [ + {id: 'items', title: Ox._('items')}, + {}, + {id: 'hours', title: Ox._('hours')}, + {id: 'days', title: Ox._('days')}, + {}, + {id: 'GB', title: 'GB'} + ], + overlap: 'left', + width: 64 + }) + ], + float: 'right', + width: 120 + }), + Ox.Select({ + items: self.options.sortKeys, + width: 128 + }), + Ox.FormElementGroup({ + elements: [ + Ox.Select({ + items: [ + {id: 'ascending', title: Ox._('ascending')}, + {id: 'descending', title: Ox._('descending')} + ], + width: 128 + }), + Ox.Label({ + overlap: 'left', + title: Ox._('order'), + width: 72 + }) + ], + float: 'right', + width: 200 + }) + ], + separators: [ + {title: Ox._('Limit to'), width: 56}, + {title: Ox._('sorted by'), width: 60}, // fixme: this is odd, should be 64 + {title: Ox._('in'), width: 32} + ] + }); + + self.$view = Ox.InputGroup({ + inputs: [ + Ox.Checkbox({ + width: 16 + }), + Ox.Select({ + items: self.options.viewKeys, + width: 128 + }), + Ox.Select({ + items: self.options.sortKeys, + width: 128 + }), + Ox.FormElementGroup({ + elements: [ + Ox.Select({ + items: [ + {id: 'ascending', title: Ox._('ascending')}, + {id: 'descending', title: Ox._('descending')} + ], + width: 128 + }), + Ox.Label({ + overlap: 'left', + title: Ox._('order'), + width: 72 + }) + ], + float: 'right', + width: 200 + }) + ], + separators: [ + {title: Ox._('View'), width: 48}, + {title: Ox._('sorted by'), width: 60}, + {title: Ox._('in'), width: 32} + ] + }); + + // limit and view temporarily disabled + self.$items = self.options.list + ? [self.$operator, self.$save/*, self.$limit, self.$view*/] + : [self.$operator/*, self.$limit, self.$view*/]; + + self.numberOfAdditionalFormItems = self.$items.length; + + self.$form = Ox.Form({ + items: self.$items + }).appendTo(that); + renderConditions(); + //that.$element = self.$form.$element; + + function addCondition(pos, subpos, isGroup) { + subpos = Ox.isUndefined(subpos) ? -1 : subpos; + var key = self.options.findKeys[0], + condition = { + key: key.id, + value: '', + operator: self.conditionOperators[key.type][0].id + }; + if (isGroup) { + Ox.Log('Form', 'isGroup', self.options.query.operator) + condition = { + conditions: [condition], + operator: self.options.query.operator == '&' ? '|' : '&' + }; + } + if (subpos == -1) { + self.options.query.conditions.splice(pos, 0, condition); + } else { + self.options.query.conditions[pos].conditions.splice(subpos, 0, condition); + } + renderConditions(); + if (!isUselessCondition(pos, subpos)) { + triggerChangeEvent(); + } + } + + function changeConditionKey(pos, subpos, key) { + subpos = Ox.isUndefined(subpos) ? -1 : subpos; + Ox.Log('Form', 'changeConditionKey', pos, subpos, key); + var condition = subpos == -1 + ? self.options.query.conditions[pos] + : self.options.query.conditions[pos].conditions[subpos], + oldFindKey = Ox.getObjectById(self.options.findKeys, condition.key), + newFindKey = Ox.getObjectById(self.options.findKeys, key), + oldConditionType = getConditionType(oldFindKey.type), + newConditionType = getConditionType(newFindKey.type), + changeConditionType = oldConditionType != newConditionType, + changeConditionFormat = !Ox.isEqual(oldFindKey.format, newFindKey.format), + wasUselessCondition = isUselessCondition(pos, subpos); + Ox.Log('Form', 'old new', oldConditionType, newConditionType) + condition.key = key; + if (changeConditionType || changeConditionFormat) { + if (Ox.getIndexById(self.conditionOperators[newConditionType], condition.operator) == -1) { + condition.operator = self.conditionOperators[newConditionType][0].id; + } + if ( + ['string', 'text'].indexOf(oldConditionType) == -1 + || ['string', 'text'].indexOf(newConditionType) == -1 + ) { + condition.value = self.defaultValue[newFindKey.type]; + } + renderConditions(); + } + if (!(wasUselessCondition && isUselessCondition(pos, subpos))) { + triggerChangeEvent(); + } + } + + function changeConditionOperator(pos, subpos, operator) { + subpos = Ox.isUndefined(subpos) ? -1 : subpos; + Ox.Log('FILTER', 'chCoOp', 'query', self.options.query) + var condition = subpos == -1 + ? self.options.query.conditions[pos] + : self.options.query.conditions[pos].conditions[subpos], + isBetween = operator.indexOf(',') > -1, + wasBetween = Ox.isArray(condition.value), + wasUselessCondition = isUselessCondition(pos, subpos); + Ox.Log('FILTER', 'chCoOp', 'iB/wB', isBetween, wasBetween) + condition.operator = operator; + if (isBetween && !wasBetween) { + condition.operator = condition.operator.replace(',', ''); + condition.value = [condition.value, condition.value] + renderConditions(); + } else if (!isBetween && wasBetween) { + condition.value = condition.value[0] + renderConditions(); + } + if (!(wasUselessCondition && isUselessCondition(pos, subpos))) { + triggerChangeEvent(); + } + } + + function changeConditionValue(pos, subpos, value) { + Ox.Log('FILTER', 'cCV', pos, subpos, value); + var condition = subpos == -1 + ? self.options.query.conditions[pos] + : self.options.query.conditions[pos].conditions[subpos]; + condition.value = value; + triggerChangeEvent(); + } + + function changeGroupOperator(pos, value) { + self.options.query.conditions[pos].operator = value; + triggerChangeEvent(); + } + + function changeOperator(data) { + var hasGroups = false; + self.options.query.operator = data.value; + Ox.forEach(self.options.query.conditions, function(condition) { + if (condition.conditions) { + hasGroups = true; + return false; // break + } + }); + hasGroups && renderConditions(); + self.options.query.conditions.length > 1 && triggerChangeEvent(); + } + + function getConditionType(type) { + type = Ox.isArray(type) ? type[0] : type; + if (['float', 'hue', 'integer', 'time'].indexOf(type) > -1) { + type = 'number'; + } + return type; + } + + function isUselessCondition(pos, subpos) { + subpos = Ox.isUndefined(subpos) ? -1 : subpos; + var conditions = subpos == -1 + ? self.options.query.conditions[pos].conditions + || [self.options.query.conditions[pos]] + : [self.options.query.conditions[pos].conditions[subpos]], + isUseless = false; + Ox.forEach(conditions, function(condition) { + isUseless = ['string', 'text'].indexOf(getConditionType( + Ox.getObjectById(self.options.findKeys, condition.key).type + )) > -1 + && ( + self.options.query.operator == '&' ? ['', '^', '$'] : ['!', '!^', '!$'] + ).indexOf(condition.operator) > -1 + && condition.value === ''; + if (!isUseless) { + return false; // break if one of the conditions is not useless + } + }); + return isUseless; + } + + function removeCondition(pos, subpos) { + subpos = Ox.isUndefined(subpos) ? -1 : subpos; + var wasUselessCondition = isUselessCondition(pos, subpos); + if (subpos == -1 || self.options.query.conditions[pos].conditions.length == 1) { + self.options.query.conditions.splice(pos, 1); + } else { + self.options.query.conditions[pos].conditions.splice(subpos, 1); + } + renderConditions(); + if (!wasUselessCondition) { + triggerChangeEvent(); + } + } + + function renderButtons(pos, subpos) { + subpos = Ox.isUndefined(subpos) ? -1 : subpos; + var isGroup = subpos == -1 && self.options.query.conditions[pos].conditions; + return [].concat([ + Ox.Button({ + id: 'remove', + title: self.options.query.conditions.length == 1 ? 'close' : 'remove', + tooltip: self.options.query.conditions.length == 1 ? Ox._('Reset this condition') + : isGroup ? Ox._('Remove this group of conditions') + : Ox._('Remove this condition'), + type: 'image' + }) + .css({margin: '0 4px 0 ' + (isGroup ? '292px' : '8px')}) // fixme: 296 is probably correct, but labels seem to be too wide + .bindEvent({ + click: function(data) { + var key; + if (self.options.query.conditions.length == 1) { + key = self.options.findKeys[0]; + self.options.query.conditions = [{ + key: key.id, + value: '', + operator: self.conditionOperators[key.type][0].id + }]; + renderConditions(); + triggerChangeEvent(); + } else if (this.$element.parent().data('subposition') == -1) { + removeCondition(this.$element.parent().data('position')); + } else { + removeCondition( + this.$element.parent().data('position'), + this.$element.parent().data('subposition') + ); + } + } + }), + Ox.Button({ + id: 'add', + title: Ox._('add'), + tooltip: Ox._('Add a condition'), + type: 'image' + }) + .css({margin: '0 ' + (subpos == -1 ? '4px' : '0') + ' 0 4px'}) + .bindEvent({ + click: function(data) { + Ox.Log('Form', 'add...', data, this.$element.parent().data('position'), this.$element.parent().data('subposition')) + if (this.$element.parent().data('subposition') == -1) { + addCondition(this.$element.parent().data('position') + 1); + } else { + addCondition( + this.$element.parent().data('position'), + this.$element.parent().data('subposition') + 1 + ); + } + } + }) + ], subpos == -1 ? [ + Ox.Button({ + id: 'addgroup', + title: Ox._('bracket'), + tooltip: Ox._('Add a group of conditions'), + type: 'image' + }) + .css({margin: '0 0 0 4px'}) + .bindEvent({ + click: function(data) { + addCondition(this.$element.parent().data('position') + 1, -1, true) + } + }) + ] : []); + } + + function renderCondition(condition, pos, subpos) { + subpos = Ox.isUndefined(subpos) ? -1 : subpos; + var condition = subpos == -1 + ? self.options.query.conditions[pos] + : self.options.query.conditions[pos].conditions[subpos]; + Ox.Log('Form', 'renderCondition', condition, pos, subpos) + return Ox.FormElementGroup({ + elements: [ + renderConditionKey(condition), + renderConditionOperator(condition), + renderConditionValue(condition) + ].concat(renderButtons(pos, subpos)) + }) + .css({marginLeft: subpos == -1 ? 0 : '24px'}) + .data({position: pos, subposition: subpos}); + } + + function renderConditionKey(condition) { + return Ox.Select({ + items: self.options.findKeys, + //items: Ox.extend({}, self.options.findKeys), // fixme: Ox.Menu messes with keys + overlap: 'right', + value: condition.key, + width: 128 + }) + .bindEvent({ + change: function(data) { + var $element = this.$element.parent(); + changeConditionKey( + $element.data('position'), + $element.data('subposition'), + data.value + ); + } + }); + } + + function renderConditionOperator(condition) { + Ox.Log('FILTER', 'rCO', condition, self.conditionOperators[getConditionType( + Ox.getObjectById(self.options.findKeys, condition.key).type + )]) + return Ox.Select({ + items: self.conditionOperators[getConditionType( + Ox.getObjectById(self.options.findKeys, condition.key).type + )], + overlap: 'right', + value: condition.operator + (Ox.isArray(condition.value) ? ',' : ''), + width: 128 + }) + .bindEvent({ + change: function(data) { + var $element = this.$element.parent(); + changeConditionOperator( + $element.data('position'), + $element.data('subposition'), + data.value + ); + } + }); + } + + function renderConditionValue(condition) { + return (!Ox.isArray(condition.value) + ? renderInput(condition) + : Ox.InputGroup({ + inputs: [ + renderInput(condition, 0).options({id: 'start'}), + renderInput(condition, 1).options({id: 'end'}) + ], + separators: [ + {title: Ox._('and'), width: 32} + ] + }) + ).bindEvent({ + change: change, + submit: change + }); + function change(data) { + var $element = this.$element.parent(); + changeConditionValue( + $element.data('position'), + $element.data('subposition'), + data.value + ); + } + } + + function renderConditions() { + Ox.Log('Form', 'renderConditions', self.options.query) + var $conditions = []; + while (self.$form.options('items').length > self.numberOfAdditionalFormItems) { + self.$form.removeItem(1); + } + self.options.query.conditions.forEach(function(condition, pos) { + if (!condition.conditions) { + $conditions.push(renderCondition(condition, pos)); + } else { + $conditions.push(renderGroup(condition, pos)); + condition.conditions.forEach(function(subcondition, subpos) { + $conditions.push(renderCondition(subcondition, pos, subpos)); + }); + } + }); + $conditions.forEach(function($condition, pos) { + self.$form.addItem(1 + pos, $condition); + }); + } + + function renderGroup(condition, pos) { + var subpos = -1; + var $condition = Ox.FormElementGroup({ + elements: [ + Ox.Label({ + title: self.options.query.operator == '&' + ? (pos == 0 ? 'Both' : 'and') + : (pos == 0 ? 'Either': 'or'), + overlap: 'right', + width: 48 + }).addClass('OxGroupLabel'), + Ox.FormElementGroup({ + elements: [ + Ox.Select({ + items: self.operators, + value: self.options.query.operator == '&' ? '|' : '&', + width: 48 + }) + .bindEvent({ + change: function(data) { + var $element = this.$element.parent().parent(); + changeGroupOperator( + $element.data('position'), + data.value + ); + } + }), + Ox.Label({ + overlap: 'left', + title: Ox._('of the following conditions'), + width: 160 + }) + ], + float: 'right', + width: 208 + }), + ].concat(renderButtons(pos, subpos, true)), + float: 'left' + }) + .data({position: pos}); + return $condition; + } + + function renderInput(condition, index) { + Ox.Log('Form', 'renderInput', condition) + var $input, + findKey = Ox.getObjectById(self.options.findKeys, condition.key), + isArray = Ox.isArray(condition.value), + isHue, + // FIXME: always use 'int' + type = findKey.type == 'integer' ? 'int' : findKey.type, + value = !isArray ? condition.value : condition.value[index], + formatArgs, formatType, title; + if (type == 'boolean') { + $input = Ox.Select({ + items: ['true', 'false'], + value: value ? 'true' : 'false', + width: 288 + }); + } else if (type == 'enum') { + Ox.Log('FILTER', findKey, condition) + $input = Ox.Select({ + items: findKey.values.map(function(v, i) { + return {id: i, title: v} + }), + value: value, + width: !isArray ? 288 : 128 + }); + } else if (type == 'list') { + Ox.Log('FILTER', findKey) + $input = Ox.Input({ + autocomplete: findKey.values, + autocompleteSelect: true, + autocompleteSelectSubmit: true, + value: value, + width: 288 + }); + } else if (findKey.format) { + formatArgs = findKey.format.args + formatType = findKey.format.type; + if (formatType == 'color') { + isHue = formatArgs[0] == 'hue'; + $input = Ox.Range({ + max: isHue ? 360 : 1, + min: 0, + size: !isArray ? 288 : 128, // fixme: should be width! + width: !isArray ? 288 : 128, // have to set this too, for formatting when tuple + step: isHue ? 1 : 0.01, + thumbSize: 48, + thumbValue: true, + trackColors: isHue ? [ + 'rgb(255, 0, 0)', 'rgb(255, 255, 0)', + 'rgb(0, 255, 0)', 'rgb(0, 255, 255)', + 'rgb(0, 0, 255)', 'rgb(255, 0, 255)', + 'rgb(255, 0, 0)' + ] : ['rgb(0, 0, 0)', 'rgb(255, 255, 255)'], + value: value + }); + } else if (formatType == 'date') { + $input = Ox.DateInput(!isArray ? { + value: value, + width: {day: 66, month: 66, year: 140} + } : { + value: value, + width: {day: 32, month: 32, year: 48} + }); + } else if (formatType == 'duration') { + $input = Ox.TimeInput(!isArray ? { + seconds: true, + value: value, + width: {hours: 91, minutes: 91, seconds: 90} + } : { + seconds: true, + value: value, + width: {hours: 38, minutes: 37, seconds: 37} + }); + } else if (formatType == 'number') { + $input = Ox.Input({ + type: type, + value: value, + width: 288 + }); + } else if (formatType == 'resolution') { + $input = Ox.InputGroup({ + inputs: [ + Ox.Input({ + id: 'width', + type: 'int', + value: value + }), + Ox.Input({ + id: 'height', + type: 'int', + value: value + }) + ], + separators: [{title: 'x', width: 16}], + width: !isArray ? 288 : 128 + }) + } else if ([ + 'currency', 'percent', 'unit', 'value' + ].indexOf(formatType) > -1) { + title = formatType == 'percent' ? '%' : formatArgs[0]; + $input = Ox.FormElementGroup({ + elements: [ + Ox.Input({ + type: type, + value: value, + width: !isArray ? 240 : 80 + }), + formatType == 'value' ? Ox.Select({ + overlap: 'left', + items: ['K', 'M', 'G', 'T'].map(function(prefix, i) { + return {id: Math.pow(1000, i + 1), title: prefix + title}; + }), + width: 48 + }) : Ox.Label({ + overlap: 'left', + textAlign: 'center', + title: title, + width: 48 + }) + ], + float: 'right', + join: function(value) { + return formatType == 'value' + ? value[0] * value[1] + : value[0]; + }, + split: function(value) { + + }, + width: !isArray ? 288 : 128 + }) + } + } else { + $input = Ox.Input({ + type: type, + value: value, + width: !isArray ? 288 : 128 + }); + } + return $input; + } + + function triggerChangeEvent() { + var query = Ox.clone(self.options.query, true); + /* + // FIXME: doesn't work for nested conditions + query.conditions.forEach(function(condition) { + // Ox.print('CO', condition.operator) + condition.operator = condition.operator.replace(':', ''); + }); + */ + that.triggerEvent('change', {query: query}); + } + + /*@ + getList getList + @*/ + // fixme: is this the best way/name? + that.getList = function() { + if (self.$save) { + var value = self.$save.value(); + return { + save: value[0], + name: value[1], + query: self.options.query + }; + } + }; + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/Form.js b/demo/static/OxJS/dev/Ox.UI/js/Form/Form.js new file mode 100644 index 0000000..3aeea71 --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/Form.js @@ -0,0 +1,184 @@ +'use strict'; + +/*@ +Ox.Form Form Object + options Options object + error error + id id + items [] + self Shared private variable + ([options[, self]]) -> Form Object + change change + validate validate + submit submit +@*/ + +Ox.Form = function(options, self) { + + self = self || {}; + var that = Ox.Element({}, self) + .defaults({ + error: '', + id: '', + items: [], + validate: function(valid) { + return Ox.every(valid); + } + }) + .options(options || {}) + .addClass('OxForm'); + + Ox.extend(self, { + $items: [], + $messages: [], + itemIds: [], + itemIsValid: [] + }); + + self.options.items.forEach(function(item, i) { + validateItem(i, function(valid) { + self.itemIsValid[i] = valid; + }); + self.itemIds[i] = item.options('id') || item.id; + self.$items[i] = Ox.FormItem({element: item}).appendTo(that); + item.bindEvent({ + autovalidate: function(data) { + validateForm(i, data.valid); + data.valid && self.$items[i].setMessage(''); + }, + /* + // fixme: should't inputs also trigger a change event? + blur: function(data) { + that.triggerEvent('change', { + id: self.itemIds[i], + data: data + }); + }, + */ + change: function(data) { + // fixme: shouldn't this be key/value instead of id/data? + that.triggerEvent('change', { + id: self.itemIds[i], + data: data + }); + validateItem(i, function(valid) { + validateForm(i, valid); + }); + }, + submit: function(data) { + self.formIsValid && that.submit(); + }, + validate: function(data) { + validateForm(i, data.valid); + // timeout needed for cases where the form is removed + // from the DOM, triggering blur of an empty item - + // in this case, we don't want the message to appear + setTimeout(function() { + self.$items[i].setMessage(data.valid ? '' : data.message); + }, 0); + } + }); + }); + + self.formIsValid = self.options.validate(self.itemIsValid); + + function getItemIndexById(id) { + return self.itemIds.indexOf(id); + } + + function validateForm(pos, valid) { + self.itemIsValid[pos] = valid; + if (self.options.validate(self.itemIsValid) != self.formIsValid) { + self.formIsValid = !self.formIsValid; + that.triggerEvent('validate', { + valid: self.formIsValid + }); + } + } + + function validateItem(pos, callback) { + var item = self.options.items[pos], + validate = item.options('validate'); + if (validate) { + validate(item.value(), function(data) { + callback(data.valid); + }); + } else { + callback(item.value && !Ox.isEmpty(item.value)); + } + } + + /*@ + addItem addItem + (pos, item) -> add item at position + @*/ + that.addItem = function(pos, item) { + Ox.Log('Form', 'addItem', pos) + self.options.items.splice(pos, 0, item); + self.$items.splice(pos, 0, Ox.FormItem({element: item})); + pos == 0 ? + self.$items[pos].insertBefore(self.$items[0]) : + self.$items[pos].insertAfter(self.$items[pos - 1]); + } + + /*@ + removeItem removeItem + (pos) -> remove item from position + @*/ + that.removeItem = function(pos) { + Ox.Log('Form', 'removeItem', pos); + self.$items[pos].remove(); + self.options.items.splice(pos, 1); + self.$items.splice(pos, 1); + } + + that.setMessages = function(messages) { + Ox.forEach(messages, function(v) { + self.$items[getItemIndexById(v.id)].setMessage(v.message); + }); + }; + + /*@ + submit submit + @*/ + that.submit = function() { + that.triggerEvent('submit', {values: that.values()}); + }; + + /*@ + valid valid + @*/ + that.valid = function() { + return self.formIsValid; + }; + + /*@ + values values + @*/ + that.values = function() { + // FIXME: this should accept a single string argument to get a single value + /* + get/set form values + call without arguments to get current form values + pass values as array to set values (not implemented) + */ + var values = {}; + if (arguments.length == 0) { + self.$items.forEach(function($item, i) { + values[self.itemIds[i]] = self.$items[i].value(); + }); + //Ox.Log('Form', 'VALUES', values) + return values; + } else { + Ox.Log('Form', 'SET FORM VALUES', arguments[0]) + Ox.forEach(arguments[0], function(value, key) { + var index = getItemIndexById(key); + index > -1 && self.options.items[index].value(value); + }); + return that; + } + }; + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/FormElementGroup.js b/demo/static/OxJS/dev/Ox.UI/js/Form/FormElementGroup.js new file mode 100644 index 0000000..2346a08 --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/FormElementGroup.js @@ -0,0 +1,128 @@ +'use strict'; + +/*@ +Ox.FormElementGroup FormElementGroup Element + options Options object + id element id + elements <[o:Ox.Element]|[]> elements in group + float alignment + separators separators (not implemented) + width group width + self Shared private variable + ([options[, self]]) -> FormElementGroup Element + autovalidate autovalidate + change change + validate validate +@*/ + +Ox.FormElementGroup = function(options, self) { + + self = self || {}; + var that = Ox.Element({}, self) + .defaults({ + id: '', + elements: [], + float: 'left', + join: null, + separators: [], + split: null, + value: options.split ? '' : [], + width: 0 + }) + .options(options || {}) + .update({ + value: setValue + }) + .addClass('OxInputGroup'); + + if (Ox.isEmpty(self.options.value)) { + self.options.value = getValue(); + } else { + setValue(); + } + + ( + self.options.float == 'left' ? + self.options.elements : Ox.clone(self.options.elements).reverse() + ).forEach(function($element) { + $element.css({ + float: self.options.float // fixme: make this a class + }) + .bindEvent({ + autovalidate: function(data) { + that.triggerEvent({autovalidate: data}); + }, + change: change, + //submit: change, + validate: function(data) { + that.triggerEvent({validate: data}); + } + }) + .appendTo(that); + }); + + function change(data) { + self.options.value = getValue(); + that.triggerEvent('change', {value: self.options.value}); + } + + /* + if (self.options.width) { + setWidths(); + } else { + self.options.width = getWidth(); + } + that.css({ + width: self.options.width + 'px' + }); + */ + + function getValue() { + var value = self.options.elements.map(function($element) { + return $element.value ? $element.value() : void 0; + }); + return self.options.join ? self.options.join(value) : value; + } + + function getWidth() { + + } + + function setValue() { + var values = self.options.split + ? self.options.split(self.options.value) + : self.options.value; + values.forEach(function(value, i) { + self.options.elements[i].value && self.options.elements[i].value(value); + }); + } + + function setWidth() { + + } + + /*@ + replaceElement replaceElement + (pos, element) -> replcae element at position + @*/ + that.replaceElement = function(pos, element) { + Ox.Log('Form', 'Ox.FormElementGroup replaceElement', pos, element) + self.options.elements[pos].replaceWith(element.$element); + self.options.elements[pos] = element; + }; + + /*@ + value value + @*/ + that.value = function() { + var values = self.options.elements.map(function(element) { + return element.value ? element.value() : void 0; + }); + return self.options.joinValues + ? self.options.joinValues(values) + : values; + }; + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/FormItem.js b/demo/static/OxJS/dev/Ox.UI/js/Form/FormItem.js new file mode 100644 index 0000000..baff0de --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/FormItem.js @@ -0,0 +1,53 @@ +'use strict'; + +/*@ +Ox.FormItem FormItem Element, wraps form element with an error message + options Options object + element element + error error message + self Shared private variable + ([options[, self]]) -> FormItem Element +@*/ + +Ox.FormItem = function(options, self) { + + self = self || {}; + var that = Ox.Element({}, self) + .defaults({ + element: null, + error: '' + }) + .options(options || {}) + .addClass('OxFormItem'); + + self.description = self.options.element.options('description'); + if (self.description) { + $('
') + .addClass('OxFormDescription OxSelectable') + .html(self.description) + .appendTo(that); + } + that.append(self.options.element); + self.$message = Ox.Element() + .addClass('OxFormMessage OxSelectable') + .appendTo(that); + + /*@ + setMessage set message + (message) -> set message + @*/ + that.setMessage = function(message) { + self.$message.html(message)[message !== '' ? 'show' : 'hide'](); + }; + + /*@ + value get value + () -> get value of wrapped element + @*/ + that.value = function() { + return self.options.element.value(); + }; + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/FormPanel.js b/demo/static/OxJS/dev/Ox.UI/js/Form/FormPanel.js new file mode 100644 index 0000000..4cf5c33 --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/FormPanel.js @@ -0,0 +1,204 @@ +'use strict'; + +/*@ +Ox.FormPanel Form Panel + options Options + self Shared private variable + ([options[, self]]) -> Form Panel + change Fires when a value changed + select Fires when a section gets selected + validate Fires when the form becomes valid or invalid +@*/ +Ox.FormPanel = function(options, self) { + + self = self || {}; + var that = Ox.Element({}, self) + .defaults({ + form: [] + }) + .options(options || {}); + + self.section = 0; + self.sectionTitle = self.options.form[self.section].title; + self.$list = Ox.TableList({ + columns: [ + { + id: 'id', + visible: false + }, + { + format: function(value) { + return $('') + .attr({ + src: Ox.UI.getImageURL('symbolCheck') + }) + .css({ + width: '10px', + height: '10px', + margin: '2px 2px 2px 0', + opacity: value ? 1 : 0.1 + }) + }, + id: 'valid', + title: Ox._('Valid'), + visible: true, + width: 16 + }, + { + format: function(value) { + return (Ox.indexOf(self.options.form, function(section) { + return section.title == value; + }) + 1) + '. ' + value; + }, + id: 'title', + title: Ox._('Title'), + visible: true, + width: 240 + } + ], + items: self.options.form.map(function(section) { + return {id: section.id, title: section.title, valid: false}; + }), + max: 1, + min: 1, + selected: [self.options.form[0].id], + sort: [{key: 'id', operator: '+'}], + unique: 'id', + width: 256 + }).bindEvent({ + select: function(data) { + self.$sections[self.section].hide(); + self.section = Ox.getIndexById(self.options.form, data.ids[0]); + self.$sections[self.section].show(); + that.triggerEvent('select', {section: data.ids[0]}); + } + }); + + self.$section = $('
') + .css({overflowY: 'auto'}); + self.$forms = []; + self.$sections = self.options.form.map(function(section, i) { + return $('
') + .css({ + width: ( + section.descriptionWidth || section.items[0].options('width') + ) + 'px', + margin: '16px' + }) + .append( + $('
') + .addClass('OxSelectable') + .css({marginBottom: '8px', fontWeight: 'bold'}) + .html((i + 1) + '. ' + section.title) + ) + .append( + $('
') + .addClass('OxSelectable') + .css({marginBottom: '16px'}) + .html(section.description) + ) + .append( + self.$forms[i] = Ox.Form({ + items: section.items, + validate: section.validate + }) + .bindEvent({ + change: function(data) { + self.$list.value(section.id, 'valid', self.$forms[i].valid()); + that.triggerEvent('change', { + section: section.id, + data: data + }); + }, + validate: function(data) { + self.$list.value(section.id, 'valid', data.valid); + that.triggerEvent('validate', { + section: section.id, + data: data + }); + } + }) + ) + .hide() + .appendTo(self.$section); + }); + + self.$list.bindEvent('load', function() { + self.$forms.forEach(function($form, i) { + self.$list.value(self.options.form[i].id, 'valid', $form.valid()); + }); + }); + + self.$sections[0].show(); + + that.$element = Ox.SplitPanel({ + elements: [ + { + element: self.$list, + resizable: true, + resize: [256], + size: 256 + }, + { + element: self.$section + } + ], + orientation: 'horizontal' + }); + + /*@ + renderPrintVersion renderPrintVersion + (title) -> + @*/ + that.renderPrintVersion = function(title) { + var $printVersion = $('
').css({overflowY: 'auto'}); + $printVersion.append( + $('
') + .addClass('OxFormSectionTitle') + .css({ + height: '16px', + padding: '16px 16px 8px 16px', + fontWeight: 'bold' + }) + .html(title) + ); + self.$sections.forEach(function($section, i) { + // jQuery bug: textarea html/val does not survive cloning + // http://bugs.jquery.com/ticket/3016 + var $clone = $section.clone(true), + textareas = { + section: $section.find('textarea'), + clone: $clone.find('textarea') + }; + textareas.section.each(function(i) { + $(textareas.clone[i]).val($(this).val()); + }); + $printVersion + .append( + $('
').css({ + height: '1px', + margin: '8px 0 8px 0', + background: 'rgb(128, 128, 128)' + }) + ) + .append( + $clone.show() + ); + }); + return $printVersion; + }; + + /*@ + values values + @*/ + that.values = function() { + var values = {}; + self.options.form.forEach(function(section, i) { + values[section.id] = self.$forms[i].values(); + }); + return values; + }; + + return that; + +}; diff --git a/demo/static/OxJS/dev/Ox.UI/js/Form/Input.js b/demo/static/OxJS/dev/Ox.UI/js/Form/Input.js new file mode 100644 index 0000000..c44bcc9 --- /dev/null +++ b/demo/static/OxJS/dev/Ox.UI/js/Form/Input.js @@ -0,0 +1,966 @@ +'use strict'; + +/*@ +Ox.Input Input Element + options Options object + arrows if true, and type is 'float' or 'int', display arrows + arrowStep step when clicking arrows + autocomplete array of possible values, or + function(key, value, callback), returns one or more values + autocompleteReplace if true, value is replaced + autocompleteReplaceCorrect if true, only valid values can be entered + autocompleteSelect if true, menu is displayed + autocompleteSelectHighlight if true, value in menu is highlighted + autocompleteSelectMaxWidth Maximum width of autocomplete menu, or 0 + autocompleteSelectSubmit if true, submit input on menu selection + autocorrect ('email', 'float', 'int', 'phone', 'url'), or + regexp(value), or + function(key, value, blur, callback), returns value + autovalidate --remote validation-- + clear if true, has clear button + changeOnKeypress if true, fire change event while typing + disabled if true, is disabled + height px (for type='textarea' and type='range' with orientation='horizontal') + id element id + key to be passed to autocomplete and autovalidate functions + label Label + labelWidth Label width + max max value if type is 'int' or 'float' + min min value if type is 'int' or 'float' + name will be displayed by autovalidate function ('invalid ' + name) + overlap '', 'left' or 'right', will cause padding and negative margin + picker picker object + rangeOptions range options + arrows boolean, if true, display arrows + //arrowStep number, step when clicking arrows + //arrowSymbols array of two strings + max number, maximum value + min number, minimum value + orientation 'horizontal' or 'vertical' + step number, step + thumbValue boolean, if true, value is displayed on thumb, or + array of strings per value, or + function(value), returns string + thumbSize integer, px + trackGradient string, css gradient for track + trackImage string, image url, or + array of image urls + //trackStep number, 0 for 'scroll here', positive for step + trackValues boolean + serialize function used to serialize value in submit + style 'rounded' or 'square' + textAlign 'left', 'center' or 'right' + type 'float', 'int', 'password', 'text', 'textarea' + value string + validate remote validation + width px + ([options[, self]]) -> Input Element + autocomplete autocomplete + autovalidate autovalidate + blur blur + cancel cancel + change input changed event + clear clear + focus focus + insert insert + submit input submit event + validate validate +@*/ + +Ox.Input = function(options, self) { + + self = self || {}; + var that = Ox.Element({ + element: options.element || '
' + }, self) + .defaults({ + arrows: false, + arrowStep: 1, + autocomplete: null, + autocompleteReplace: false, + autocompleteReplaceCorrect: false, + autocompleteSelect: false, + autocompleteSelectHighlight: false, + autocompleteSelectMax: 0, + autocompleteSelectMaxWidth: 0, + autocompleteSelectSubmit: false, + autovalidate: null, + changeOnKeypress: false, + clear: false, + decimals: 0, + disabled: false, + height: 16, + key: '', + min: -Infinity, + max: Infinity, + label: '', + labelWidth: 64, + overlap: 'none', + placeholder: '', + serialize: null, + style: 'rounded', + textAlign: 'left', + type: 'text', + validate: null, + value: '', + width: 128 + }) + .options(options || {}) + .update(function(key, value) { + var inputWidth; + if ([ + 'autocomplete', 'autocompleteReplace', 'autocompleteSelect', 'autovalidate' + ].indexOf(key) > -1) { + if (self.options.autocomplete && self.options.autocompleteSelect) { + self.$autocompleteMenu = constructAutocompleteMenu(); + } + self.bindKeyboard = self.options.autocomplete || self.options.autovalidate; + } else if (key == 'disabled') { + self.$input.attr({disabled: value}); + } else if (key == 'height') { + that.css({height: value + 'px'}); + self.$input.css({height: value - 6 + 'px'}); + } else if (key == 'labelWidth') { + self.$label.options({width: value}); + inputWidth = getInputWidth(); + self.$input.css({ + width: inputWidth + 'px' + }); + self.hasPasswordPlaceholder && self.$placeholder.css({ + width: inputWidth + 'px' + }); + } else if (key == 'placeholder') { + setPlaceholder(); + } else if (key == 'value') { + if (self.options.type == 'float' && self.options.decimals) { + self.options.value = self.options.value.toFixed(self.options.decimals); + } + self.$input.val(self.options.value); + that.is('.OxError') && that.removeClass('OxError'); + setPlaceholder(); + } else if (key == 'width') { + that.css({width: self.options.width + 'px'}); + inputWidth = getInputWidth(); + self.$input.css({ + width: inputWidth + 'px' + }); + self.hasPasswordPlaceholder && self.$placeholder.css({ + width: inputWidth + 'px' + }); + } + }) + .addClass( + 'OxInput OxMedium Ox' + Ox.toTitleCase(self.options.style) + + (self.options.type == 'textarea' ? ' OxTextarea' : '') /*+ ( + self.options.overlap != 'none' ? + ' OxOverlap' + Ox.toTitleCase(self.options.overlap) : '' + )*/ + ) + .css( + Ox.extend({ + width: self.options.width + 'px' + }, self.options.type == 'textarea' ? { + height: self.options.height + 'px' + } : {}) + ) + .bindEvent(Ox.extend(self.options.type != 'textarea' ? { + key_enter: submit + } : {}, { + key_control_i: insert, + key_escape: cancel, + key_shift_enter: submit + })); + + if ( + Ox.isArray(self.options.autocomplete) + && self.options.autocompleteReplace + && self.options.autocompleteReplaceCorrect + && self.options.value === '' + ) { + self.options.value = self.options.autocomplete[0] + } + + // fixme: set to min, not 0 + // fixme: validate self.options.value ! + if (self.options.type == 'float') { + self.decimals = Ox.repeat('0', self.options.decimals || 1) + Ox.extend(self.options, { + autovalidate: 'float', + textAlign: 'right', + value: self.options.value || '0.' + self.decimals + }); + } else if (self.options.type == 'int') { + Ox.extend(self.options, { + autovalidate: 'int', + textAlign: 'right', + value: self.options.value || '0' + }); + } + + if (self.options.label) { + self.$label = Ox.Label({ + overlap: 'right', + textAlign: 'right', + title: self.options.label, + width: self.options.labelWidth + }) + .css({ + float: 'left' // fixme: use css rule + }) + .click(function() { + // fixme: ??? + // that.focus(); + }) + .appendTo(that); + } + + if (self.options.arrows) { + self.arrows = []; + self.arrows[0] = [ + Ox.Button({ + overlap: 'right', + title: 'left', + type: 'image' + }) + .css({ + float: 'left' + }) + .click(function() { + clickArrow(0); + }) + .appendTo(that), + Ox.Button({ + overlap: 'left', + title: 'right', + type: 'image' + }) + .css({ + float: 'right' + }) + .click(function() { + clickArrow(1); + }) + .appendTo(that) + ] + } + + self.bindKeyboard = self.options.autocomplete + || self.options.autovalidate + || self.options.changeOnKeypress; + self.hasPasswordPlaceholder = self.options.type == 'password' + && self.options.placeholder; + self.inputWidth = getInputWidth(); + + if (self.options.clear) { + self.$button = Ox.Button({ + overlap: 'left', + title: 'close', + type: 'image' + }) + .css({ + float: 'right' // fixme: use css rule + }) + .bindEvent({ + click: clear, + doubleclick: submit + }) + .appendTo(that); + } + + self.$input = $(self.options.type == 'textarea' ? ' + + + + +
+ + {% block sidebargraph %} +
+
+ +
+ + + + + + + + + + +
+ + {% endblock %} +
+ {% block sidebardetails %} + {% endblock %} +
+ + +
+ + + + diff --git a/gstudio/templates/gstudio/_header.html b/gstudio/templates/gstudio/_header.html index 90f0ca0..77066c7 100644 --- a/gstudio/templates/gstudio/_header.html +++ b/gstudio/templates/gstudio/_header.html @@ -19,6 +19,7 @@ | Images | WeTube | Videos + | OxJs | Tags + + + + + + + + + + + + + {% endblock %} + diff --git a/gstudio/urls/New.py b/gstudio/urls/New.py new file mode 100644 index 0000000..721483d --- /dev/null +++ b/gstudio/urls/New.py @@ -0,0 +1,7 @@ +from django.conf.urls import patterns +from django.views.generic import TemplateView + +urlpatterns = patterns('', + (r'^$', TemplateView.as_view(template_name="OxJS/index.html")), +# (r'^(\d+)/$', Column_View (template_name="OxJS/Column.html")), +) diff --git a/gstudio/urls/Oxjsurls.py b/gstudio/urls/Oxjsurls.py new file mode 100644 index 0000000..fdba2a5 --- /dev/null +++ b/gstudio/urls/Oxjsurls.py @@ -0,0 +1,12 @@ +"""Urls for the Gstudio sitemap""" +from django.conf.urls.defaults import url +from django.conf.urls.defaults import patterns + +urlpatterns = patterns('gstudio.views.OxjsViews', + url(r'^Wikilist/$', 'Wikilist',name='oxjs_views'), + url(r'^LoomThread/$', 'LoomThread',name='oxjs_views'), + url(r'^Wikidetail/(\d{1,4})/$' , 'Wikidetail', name='oxjs_views'), + #url(r'^Wikidetail/711/$' , 'Wikidetail2', name='oxjs_views') + url(r'^AddTag/$', 'addFunc', name='oxjs_views'), + url(r'^delPrior/$' , 'delFunc', name='oxjs_views') + ) diff --git a/gstudio/urls/__init__.py b/gstudio/urls/__init__.py index 56ab456..91b33c7 100644 --- a/gstudio/urls/__init__.py +++ b/gstudio/urls/__init__.py @@ -57,6 +57,7 @@ url(r'^resources/documents',include('gstudio.urls.docu')), url(r'^resources/loom/',include('gstudio.urls.loom')), url(r'^userpreference/',include('gstudio.urls.userpreference')), + url(r'^resources/New/',include('gstudio.urls.New')), ) diff --git a/gstudio/views/OxjsViews.py b/gstudio/views/OxjsViews.py new file mode 100644 index 0000000..0d2c416 --- /dev/null +++ b/gstudio/views/OxjsViews.py @@ -0,0 +1,126 @@ +from gstudio.methods import * +from django.http import HttpResponse , Http404, HttpResponseRedirect + +import json +import datetime +import ox +from ox.django.api import actions +from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response + +def Wikilist(request): + pages = Systemtype.objects.get(title="Wikipage") + page=pages.member_systems.all() + list1=[] + for each in page: + dict1={} + dict1['id'] = each.id + dict1['name'] = each.title + list1.append(dict1) + #response = json_response(list1) + #response = json_response({'errors': {'code': 'Incorrect code'}}) + return HttpResponse(json.dumps(list1)) + #return response#render_to_json_response(response) +#actions.register(Wikilist) + +def LoomThread(request): + threads = Systemtype.objects.get(title="Meeting") + thread=threads.member_systems.all() + list1=[] + for each in thread: + dict1={} + dict1['id'] = each.id + dict1['name'] = each.title + list1.append(dict1) + return HttpResponse(json.dumps(list1)) + + +def Wikidetail1(request): + pages = Systemtype.objects.get(title="Wikipage") + page=pages.member_systems.all() + list1=[] + for each in page: + if(each.id ==711): + dict1={} + dict1['id'] = each.id + dict1['name'] = each.title + list1.append(dict1) + return HttpResponse(json.dumps(list1)) + +def Wikidetail2(request): + pages = Systemtype.objects.get(title="Wikipage") + page=pages.member_systems.all() + #try: + # offset = int(offset) +# except ValueError: +# raise Http404() + list1 = [] + for each in page: + if(each.id == offset): + dict1 = {} + dict1['id'] = each.id + dict1['name'] = each.title + #dict1['creation_date'] =(each.start_publication).isoformat() + dict1['content'] = each.content + list1.append(dict1) + return HttpResponse(json.dumps(list1)) + +def Wikidetail(request, offset): + pages = Systemtype.objects.get(title="Wikipage") + page=pages.member_systems.all() + list1=[] + offset = int(offset); + for each in page: + i = 0; + if(each.id ==offset): + dict1={'prior_nodes' :[]} + dict1['id'] = each.id + dict1['name'] = each.title + dict1['content'] = each.content + temp = [] + prior_nodes=[] + temp= Gbobject.objects.get(id=each.id) + #dict1['temp'] = temp + #for(i=0;temp[i]!=none;i++): + # prior_nodes[i] = x.tags[0] + # i=i+1 + dict1['tags']=[] + dict1['tags']=temp.tags.split(",") + prior_nodes = temp.prior_nodes.all() + for x in prior_nodes: + #dict1['prior_nodes'].append({'id':x.id , 'title' : x.title}) + dict1['prior_nodes'].append(x.title) + #dict1['creation_date'] = each.creation_date + list1.append(dict1) + return HttpResponse(json.dumps(list1)) + #return HttpResponseRedirect("/gstudio/resources/New/"+str(offset)) + +def addFunc(request): + print "insert Addfunc" + if request.method=="GET": + #wikiid= request.G('id','') + wikiid=int(request.GET['id1']) + print wikiid,"id" + wikiid2=int(request.GET['id2']) + print wikiid2,"id" + + + #id1=int(request.POST.get['data.id1','']) + #id2=int(request.POST.get['data.id2','']) + #tags = int(offset.id2) + x=System.objects.get(id=wikiid) +# fro=int(offset.id1) + + y=System.objects.get(id=wikiid2) + x.prior_nodes.add(y) + return HttpResponse("success") + +def delFunc(request): + if request.method=="GET": + wikiid=int(request.GET['id1']) + print wikiid,"id" + wikiid2=request.GET['id2'] + print wikiid2,"id" + x=System.objects.get(id=wikiid) + y=System.objects.get(title=wikiid2) + x.prior_nodes.remove(y) + return HttpResponse("success")