function get_html_translation_table(table, quote_style) {
var entities = {},
hash_map = {},
decimal;
var constMappingTable = {},
constMappingQuoteStyle = {};
var useTable = {},
useQuoteStyle = {};
constMappingTable[0] = "HTML_SPECIALCHARS";
constMappingTable[1] = "HTML_ENTITIES";
constMappingQuoteStyle[0] = "ENT_NOQUOTES";
constMappingQuoteStyle[2] = "ENT_COMPAT";
constMappingQuoteStyle[3] = "ENT_QUOTES";
useTable = !isNaN(table)
? constMappingTable[table]
: table
? table.toUpperCase()
: "HTML_SPECIALCHARS";
useQuoteStyle = !isNaN(quote_style)
? constMappingQuoteStyle[quote_style]
: quote_style
? quote_style.toUpperCase()
: "ENT_COMPAT";
if (useTable !== "HTML_SPECIALCHARS" && useTable !== "HTML_ENTITIES") {
throw new Error("Table: " + useTable + " not supported");
}
entities["38"] = "&";
if (useTable === "HTML_ENTITIES") {
entities["160"] = " ";
entities["161"] = "¡";
entities["162"] = "¢";
entities["163"] = "£";
entities["164"] = "¤";
entities["165"] = "¥";
entities["166"] = "¦";
entities["167"] = "§";
entities["168"] = "¨";
entities["169"] = "©";
entities["170"] = "ª";
entities["171"] = "«";
entities["172"] = "¬";
entities["173"] = "­";
entities["174"] = "®";
entities["175"] = "¯";
entities["176"] = "°";
entities["177"] = "±";
entities["178"] = "²";
entities["179"] = "³";
entities["180"] = "´";
entities["181"] = "µ";
entities["182"] = "¶";
entities["183"] = "·";
entities["184"] = "¸";
entities["185"] = "¹";
entities["186"] = "º";
entities["187"] = "»";
entities["188"] = "¼";
entities["189"] = "½";
entities["190"] = "¾";
entities["191"] = "¿";
entities["192"] = "À";
entities["193"] = "Á";
entities["194"] = "Â";
entities["195"] = "Ã";
entities["196"] = "Ä";
entities["197"] = "Å";
entities["198"] = "Æ";
entities["199"] = "Ç";
entities["200"] = "È";
entities["201"] = "É";
entities["202"] = "Ê";
entities["203"] = "Ë";
entities["204"] = "Ì";
entities["205"] = "Í";
entities["206"] = "Î";
entities["207"] = "Ï";
entities["208"] = "Ð";
entities["209"] = "Ñ";
entities["210"] = "Ò";
entities["211"] = "Ó";
entities["212"] = "Ô";
entities["213"] = "Õ";
entities["214"] = "Ö";
entities["215"] = "×";
entities["216"] = "Ø";
entities["217"] = "Ù";
entities["218"] = "Ú";
entities["219"] = "Û";
entities["220"] = "Ü";
entities["221"] = "Ý";
entities["222"] = "Þ";
entities["223"] = "ß";
entities["224"] = "à";
entities["225"] = "á";
entities["226"] = "â";
entities["227"] = "ã";
entities["228"] = "ä";
entities["229"] = "å";
entities["230"] = "æ";
entities["231"] = "ç";
entities["232"] = "è";
entities["233"] = "é";
entities["234"] = "ê";
entities["235"] = "ë";
entities["236"] = "ì";
entities["237"] = "í";
entities["238"] = "î";
entities["239"] = "ï";
entities["240"] = "ð";
entities["241"] = "ñ";
entities["242"] = "ò";
entities["243"] = "ó";
entities["244"] = "ô";
entities["245"] = "õ";
entities["246"] = "ö";
entities["247"] = "÷";
entities["248"] = "ø";
entities["249"] = "ù";
entities["250"] = "ú";
entities["251"] = "û";
entities["252"] = "ü";
entities["253"] = "ý";
entities["254"] = "þ";
entities["255"] = "ÿ";
}
if (useQuoteStyle !== "ENT_NOQUOTES") {
entities["34"] = """;
}
if (useQuoteStyle === "ENT_QUOTES") {
entities["39"] = "'";
}
entities["60"] = "<";
entities["62"] = ">";
for (decimal in entities) {
if (entities.hasOwnProperty(decimal)) {
hash_map[String.fromCharCode(decimal)] = entities[decimal];
}
}
return hash_map;
}
function html_entity_decode(string, quote_style) {
var hash_map = {},
symbol = "",
tmp_str = "",
entity = "";
tmp_str = string.toString();
if (
false ===
(hash_map = this.get_html_translation_table("HTML_ENTITIES", quote_style))
) {
return false;
}
delete hash_map["&"];
hash_map["&"] = "&";
for (symbol in hash_map) {
entity = hash_map[symbol];
tmp_str = tmp_str.split(entity).join(symbol);
}
tmp_str = tmp_str.split("'").join("'");
return tmp_str;
}
var forcesJSON;
var forces;
var neighbourhoods;
var areaLayer;
var i;
var map = L.map("map").setView([51.4833, -3.1833], 10);
L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
attribution:
'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>',
maxZoom: 18
}).addTo(map);
var ForceControl = L.Control.extend({
initialize: function (name, options) {
L.Util.setOptions(this, options);
},
onAdd: function (map) {
var container = L.DomUtil.create("div", "dropdown-control");
forces = [];
$.getJSON("https://data.police.uk/api/forces", function (data) {
var htmlString =
"<label>Police force: <select id=forcesList " +
'onchange="updateNeighbourhoods()"><option>' +
"Select a Force</option>";
$.each(data, function (i, item) {
forces[i] = item;
htmlString = htmlString + "<option>" + forces[i].name + "</option>";
});
htmlString += "</select>";
container.innerHTML = htmlString;
container.firstChild.onmousedown = container.firstChild.ondblclick =
L.DomEvent.stopPropagation;
});
return container;
}
});
var NeighbourhoodControl = L.Control.extend({
initialize: function (name, options, placeholder) {
L.Util.setOptions(this, options);
},
onAdd: function (map) {
var container = L.DomUtil.create("div", "dropdown-control");
var htmlString =
'<label>Neighbourhood:<select id="neighbourhoodsList" ' +
'onchange="neighbourhoodChanged()" onclick="neighbourhoodChanged()">' +
"<option>Select a neighbourhood</option></select>";
container.innerHTML = htmlString;
container.firstChild.onmousedown = container.firstChild.ondblclick =
L.DomEvent.stopPropagation;
return container;
}
});
map.addControl(new ForceControl("forcesList", { position: "topright" }));
map.addControl(
new NeighbourhoodControl("neighbourhoodList", { position: "topright" })
);
var updateNeighbourhoods = function (name) {
var force = $("#forcesList").val();
neighbourhoods = [];
for (i in forces) {
if (forces[i].name === force) {
var id = forces[i].id;
}
}
if (id) {
var url = "https://data.police.uk/api/" + id + "/neighbourhoods";
$.getJSON(url, function (data) {
var htmlString = '<select id="neighbourhoodsList">';
$.each(data, function (i, item) {
neighbourhoods[i] = item;
htmlString =
htmlString + "<option>" + neighbourhoods[i].name + "</option>";
});
htmlString = htmlString + "</select>";
$("#neighbourhoodsList").html(htmlString);
$("#neighbourhoodsList").html(
$("#neighbourhoodsList option").sort(function (a, b) {
return a.text == b.text ? 0 : a.text < b.text ? -1 : 1;
})
);
$("#neighbourhoodsList").prepend(
$("<option>Select a neighbourhood</option>")
);
});
} else {
$("#neighbourhoodsList").html(
'<select id="neighbourhoodsList"><option>Select a police force</option></select>'
);
}
};
var neighbourhoodChanged = function () {
var hood = $("#neighbourhoodsList").val();
for (i in neighbourhoods) {
if (
html_entity_decode(neighbourhoods[i].name) === html_entity_decode(hood)
) {
var id = [];
id[0] = neighbourhoods[i].id;
}
}
var force = $("#forcesList").val();
for (i in forces) {
if (forces[i].name === force) {
id[1] = forces[i].id;
}
}
if (id[0] && id[1]) {
var latlng = [];
var url = "https://data.police.uk/api/" + id[1] + "/" + id[0] + "/boundary";
$.getJSON(url, function (data) {
$.each(data, function (i, item) {
latlng.push(new L.LatLng(data[i].latitude, data[i].longitude));
});
if (areaLayer) {
map.removeLayer(areaLayer);
}
areaLayer = new L.Polygon(latlng, {
clickable: true,
weight: 3,
opacity: 0.4,
fillOpacity: 0.1
});
map.fitBounds(areaLayer.getBounds());
areaLayer.addTo(map);
});
}
};