$(function () { $("#searchInput").keypress(function (e) { if (e.which == 13) { //Enter key pressed $("#searchChainLoc").text(""); urlHighlightParams = ""; searchButton(); } }); $("#searchButton").click(function (e) { $("#searchChainLoc").text(""); urlHighlightParams = ""; searchButton(); }); }); var serviceName = "searchaccessibilitypoc"; var indexName = "documents"; var apiVersion = "2019-05-06"; var searchApiKey = "1F29382F601EE2938863744DF641131B"; var pinFilter = ""; var mapCentre = [51.46, 0.36]; var highlightField = "content"; var pinDistanceLimit = 0.32; var urlHighlightParams = ""; var boundariesOn = false; var boundaryOn = true; var routeOn = true; var isIE = /*@cc_on!@*/false || !!document.documentMode; function searchButton(e, pinLoc) { var text = $("#searchInput").val(); var displayText = text; var bingObject = bingSearch(text); var geoFilter = bingObject.geoFilter; var count = 0; if (typeof pinLoc !== "undefined") { text = text + "+\"" + pinLoc + "\""; displayText = displayText + "\" and \"" + pinLoc; } var textResults = textSearch(text, pinFilter); if (geoFilter !== "") { var geoResults = geoSearch(geoFilter, pinFilter); if (textResults.value.length > 0) { var finalResults = deduplicate(textResults, geoResults); displayResults(finalResults, textResults["@odata.count"], displayText); GetMap(textResults.value, bingObject); count = finalResults.length; } else { displayResults(geoResults.value, 0, displayText); GetMap(geoResults.value, bingObject); count = geoResults.value.length; } } else { displayResults(textResults.value, textResults.value.length, displayText); GetMap(textResults.value, bingObject); count = textResults.value.length; } appInsights.trackEvent({ name: 'Search Event' }, { searchTerms: text, resultCount: count }); pinFilter = ""; } function bingSearch(searchText) { var geoFilter = "" var coords = []; var bingObject = {}; var name = ""; var url = "https://dev.virtualearth.net/REST/v1/Locations?" var stopWords = ["pollution", "geology"]; for (var i = 0; i < stopWords.length; i++) { searchText = searchText.toLowerCase(); searchText = searchText.replace(stopWords[i], ""); } $.ajax({ url: url, async: false, type: "GET", dataType: "JSON", data: { "culture": "en-GB", "maxResults": 1, "key": "AmvptebktO-hQjfpGosvLfkoItYVCKNESul-s19CMXmwQ_7PQGf2OuoWJsJ3eqfS", "userLocation": "51.46390151977539, 0.35016998648643494", "q": searchText + ",england", }, success: function (data) { var firstResult = data.resourceSets[0].resources[0]; coords = firstResult.point.coordinates; name = firstResult.name; if (typeof firstResult == "undefined" || coords[0] < 50.7 || coords[0] > 52.1 || coords[1] < -1 || coords[1] > 1.6) { geoFilter = ""; coords = []; } else if (firstResult.entityType == "AdminDivision2") { var box = firstResult.bbox; var geoPolygon = "geography'POLYGON((" + box[1] + " " + box[0] + ',' + box[3] + " " + box[0] + ',' + box[3] + " " + box[2] + ',' + box[1] + " " + box[2] + ',' + box[1] + " " + box[0] + "))'"; geoFilter = "GeoPointResults/any(a: geo.intersects(a/GeoPoint, " + geoPolygon + "))"; } else { var searchLocation = "geography'POINT(" + coords[1] + " " + coords[0] + ")'"; geoFilter = "GeoPointResults/any(a: geo.distance(a/GeoPoint, " + searchLocation + ") lt 5)"; } }, error: function (err) { console.log("error:" + err); } }); bingObject = { "geoFilter": geoFilter, "coords": coords, "name": name }; return bingObject; } function textSearch(text, filterExpression) { var url = "https://" + serviceName + ".search.windows.net/indexes/" + indexName + "/docs?"; var textResults = ""; var dataObject = { "api-version": apiVersion, "highlight": highlightField, "searchFields": highlightField, "search": text, "$select": "metadata_storage_path,content,contentCymru,contentBangla,GeoPointResults", "$count": "true" }; if (filterExpression !== "") { dataObject["$filter"] = filterExpression; } $.ajax({ url: url, async: false, headers: { "api-key": searchApiKey, "Content-Type": "application/json" }, type: "GET", dataType: "JSON", data: dataObject, success: function (data) { textResults = data; }, error: function (err) { console.log(err) } }); return textResults; } function geoSearch(geoFilter, filterExpression) { var url = "https://" + serviceName + ".search.windows.net/indexes/" + indexName + "/docs?"; var geoResults = null; if (filterExpression !== "") { geoFilter = filterExpression; } var dataObject = { "api-version": apiVersion, "highlight": highlightField, "search": "*", "$select": "metadata_storage_path,content,contentCymru,contentBangla,GeoPointResults", "$filter": geoFilter, "$count": "true" }; $.ajax({ url: url, async: false, headers: { "api-key": searchApiKey, "Content-Type": "application/json" }, type: "GET", dataType: "JSON", data: dataObject, success: function (data) { geoResults = data; }, error: function (err) { console.log(err) } }); return geoResults; } function deduplicate(textResults, geoResults) { var finalResults = JSON.parse(JSON.stringify(textResults.value)); for (var i = 0; i < geoResults.value.length; i++) { var count = 0; for (var j = 0; j < textResults.value.length; j++) { if (geoResults.value[i].metadata_storage_path == textResults.value[j].metadata_storage_path) { count++; } } if (count < 1) { finalResults.push(geoResults.value[i]); } } return finalResults; } function displayResults(results, textResLen, text) { var count = 1; $("#resultList").html(""); $(results).each(function () { var storageAddress = atob(this.metadata_storage_path.substring(0, this.metadata_storage_path.length - 1)); var pathParts = storageAddress.split("/"); var searchTerms = $("#searchInput").val() + "," + urlHighlightParams; var url = "../HTML/" + pathParts[5] + "/main.html" + "?text=" + searchTerms + "&#" + pathParts[6].replace(".txt", ""); var documentName = pathParts[5].replace(/_/g, " "); var section = pathParts[6].replace(".txt", ""); var sectionSplits = section.split("."); var sectionDisplay = sectionSplits[sectionSplits.length - 1].match(/[A-Z][a-z]+|[A-Z][0-9]+/g).join(" ") var highlights = this["@search.highlights"]; var currentResult = ""; if (highlightField == "contentCymru") { if (highlights == null) { currentResult = this.contentCymru; } else { currentResult = highlights.contentCymru.join('
...
'); } } else if (highlightField == "contentBangla") { if (highlights == null) { currentResult = this.contentBangla; } else { currentResult = highlights.contentBangla.join('
...
'); } } else { if (highlights == null) { currentResult = this.content; } else { currentResult = highlights.content.join('
...
'); } } $("#resultList").append("" + "
  • " + "" + documentName + ", " + sectionDisplay + "
    " + "

    " + currentResult.replace(/\r\n/g, "
    ") + "

    " + "
  • "); count++; }); $(".mapCommentary").css("display", "block"); $("#resultTitle").html("\"" + text + "\" appeared in " + textResLen + " sections"); if ((results.length - textResLen) > 0) { $("#resultTitle").append(" and " + (results.length - textResLen) + " additional sections reference nearby locations"); } $("#searchChainText").text($("#searchInput").val()); } function GetMap(results, bingObject) { var coords = bingObject.coords; var name = bingObject.name if (coords.length == 2 && mapCentre[0] == 51.46) { mapCentre = coords; } var map = new Microsoft.Maps.Map('#myMap', { center: new Microsoft.Maps.Location(mapCentre[0], mapCentre[1]), zoom: 11 }); infobox = new Microsoft.Maps.Infobox(map.getCenter(), { visible: false }); infobox.setMap(map); if (coords.length == 2) { var centrePinLoc = new Microsoft.Maps.Location(coords[0], coords[1]) var centrePin = new Microsoft.Maps.Pushpin(centrePinLoc, { color: "red", }); centrePin.metadata = { title: name }; Microsoft.Maps.Events.addHandler(centrePin, 'mouseover', pushpinMouseon); Microsoft.Maps.Events.addHandler(centrePin, 'mouseout', pushpinMouseoff); $("#redPin").css("display", "block"); } else { $("#redPin").css("display", "none"); } map.entities.push(centrePin); if (typeof results[0] !== "undefined") { addPins(map, results); } if (boundaryOn) { addBoundaries(map, LTCDevBoundary); } if (routeOn) { addRoute(map, LTCRouteSlim); } mapCentre = [51.46, 0.36]; } function addPins(map, results) { var geoPoints = []; var pinArray = []; for (var i = 0; i < results.length; i++) { for (var j = 0; j < results[i].GeoPointResults.length; j++) { if (results[i].GeoPointResults[j].GeoPoint.coordinates[1] > 50.7 && results[i].GeoPointResults[j].GeoPoint.coordinates[1] < 52.1 && results[i].GeoPointResults[j].GeoPoint.coordinates[0] > -1 && results[i].GeoPointResults[j].GeoPoint.coordinates[0] < 1.6) { geoPoints.push(results[i].GeoPointResults[j]); } } } var uniqueGeoPoints = []; $.each(geoPoints, function (index, el) { var matchingItems = $.grep(uniqueGeoPoints, function (item) { return item.Name === el.Name; }); if (matchingItems.length === 0) { uniqueGeoPoints.push(el); } }); for (var i = 0; i < uniqueGeoPoints.length; i++) { var coords = uniqueGeoPoints[i].GeoPoint.coordinates; if (mapCentre[0] == 51.46 || (coords[1] > mapCentre[0] - pinDistanceLimit && coords[1] < mapCentre[0] + pinDistanceLimit && coords[0] > mapCentre[1] - pinDistanceLimit && coords[0] < mapCentre[1] + pinDistanceLimit)) { var pinLocation = new Microsoft.Maps.Location(coords[1], coords[0]) var pin = new Microsoft.Maps.Pushpin(pinLocation, { color: "#168dc8", }); pin.metadata = { title: uniqueGeoPoints[i].Name } pinArray.push(pinLocation); Microsoft.Maps.Events.addHandler(pin, 'click', mapPinClicked); Microsoft.Maps.Events.addHandler(pin, 'mouseover', pushpinMouseon); Microsoft.Maps.Events.addHandler(pin, 'mouseout', pushpinMouseoff); map.entities.push(pin); } } if (pinArray.length > 0) { // var mapBox = Microsoft.Maps.LocationRect.fromLocations(pinArray); // map.setView({ bounds: mapBox, padding: 10 }); } } function addRoute(map, geoData) { for (var j = 0; j < geoData.length; j++) { var routeCoords = []; var line = geoData[j].geometry.coordinates[0]; for (var i = 0; i < line.length; i++) { var point = new Microsoft.Maps.Location(line[i][1], line[i][0]); routeCoords.push(point); } var route = new Microsoft.Maps.Polyline(routeCoords, { strokeColor: '#00B1B1', strokeThickness: 1, }); map.entities.push(route); } } function addBoundaries(map, geoData) { for (var j = 0; j < geoData.features.length; j++) { var boundaryCoords = []; var polygon = geoData.features[j].geometry.coordinates[0][0]; for (var i = 0; i < polygon.length; i++) { var point = new Microsoft.Maps.Location(polygon[i][1], polygon[i][0]) boundaryCoords.push(point); } var boundary = new Microsoft.Maps.Polygon(boundaryCoords, { fillColor: 'rgba(149, 237, 149, 0.3)', strokeColor: '#eb6c31', strokeThickness: 1, }); map.entities.push(boundary); } } function mapPinClicked(e) { var loc = e.target.getLocation(); var point = "geography'POINT(" + loc.longitude + " " + loc.latitude + ")'"; pinFilter = "GeoPointResults/any(a: geo.distance(a/GeoPoint, " + point + ") lt 1.5)"; mapCentre = [loc.latitude, loc.longitude]; urlHighlightParams = e.target.metadata.title; searchButton(e, e.target.metadata.title); $("#searchChainLoc").text(">>" + e.target.metadata.title); } function pushpinMouseon(e) { infobox.setOptions({ location: e.target.getLocation(), offset: new Microsoft.Maps.Point(0, 10), title: e.target.metadata.title, visible: true }); } function pushpinMouseoff() { infobox.setOptions({ visible: false }); } function linkClick(el) { var listpos = $(el).data("listposition"); var searchTerms = $(el).data("searchterms"); appInsights.trackEvent({ name: 'Link Clicked' }, { search: searchTerms, section: el.textContent, listPosition: listpos, link: el.href }); } $("#searchChainText").click(function () { urlHighlightParams = ""; $("#searchChainLoc").text(""); searchButton(); }); $("#languageButton").click(function () { $("#languageList").slideToggle(200); $("#arrow1").toggleClass("up").toggleClass("down"); }); $(".languageSelect").click(function () { $("#languageButton").html($(this).html() + ""); highlightField = $(this).attr("highlight"); $("#languageList").slideToggle(); }); $("#boundaryCheck").change(function () { boundaryOn = this.checked; searchButton(); }); $("#routeCheck").change(function () { routeOn = this.checked; searchButton(); }); var header = document.getElementById("searchRow"); var sticky = header.offsetTop; $(document.body).on('touchmove', onScroll); // for mobile $(window).on('scroll', onScroll); function onScroll() { if (window.pageYOffset > sticky) { header.classList.add("sticky"); } else { header.classList.remove("sticky"); } }