var map, manager; var centerLatitude = 39.1051, centerLongitude = -94.5712, startZoom = 11; var cases = ""; var uniquePoints = new Array(); uniquePoints.markerId = new Array(); uniquePoints.caseId = new Array(); var icons = new Array(); icons[1] = ''; icons[2] = ''; icons[7] = ''; var crimeTypeChecked = new Array(); crimeTypeChecked[1] = false; crimeTypeChecked[2] = false; crimeTypeChecked[3] = false; crimeTypeChecked[4] = false; crimeTypeChecked[5] = false; crimeTypeChecked[6] = false; crimeTypeChecked[7] = false; crimeTypeChecked[8] = false; crimeTypeChecked[9] = false; crimeTypeChecked[10] = false; crimeTypeChecked[11] = false; crimeTypeChecked[12] = false; crimeTypeChecked[13] = false; var loadingGif = "images/loading.gif"; var houseMarker = ''; var busy = false; var kmz = ''; function loadingImage(status) { busy = status; var imageDiv = document.getElementById('loading-image'); if (status == true) { var imageTag = ""; imageDiv.innerHTML = imageTag; } else { while(imageDiv.firstChild) { imageDiv.removeChild(imageDiv.firstChild); } } } function simpleRequest(crimeType) { if (crimeTypeChecked[crimeType]) { crimeTypeChecked[crimeType] = false; op = 'remove'; } else { crimeTypeChecked[crimeType] = true; op = 'add'; } changeIndicator(op, crimeType); formRequest(op, crimeType, 24); } function changeIndicator(op, crimeType) { var indicatorImage = document.getElementById(crimeType + "-crime-selected-status"); if (op == 'add') { indicatorImage.setAttribute('src', 'crime-icons/00.gif'); } if (op == 'remove') { indicatorImage.setAttribute('src', 'crime-icons/01.gif'); } } function allRequest(op) { var crimeType = new Array(); for (i = 1; i <= crimeTypeChecked.length - 1; i++) { if (crimeTypeChecked == op) { continue; } else { crimeType.push(i); changeIndicator(op, i); } } crimeType = crimeType.join(','); formRequest(op, crimeType, 24); } function formRequest(op, crimeType, age) { var parameters = "crime-type=" + crimeType + "&age=" + age; request(op, 'cases', parameters); } function request(op, type, parameters) { if (type == 'address') { if (!parameters) { return; } parameters = escape(parameters); url = '../includes/php/classes/yahoo_maps/y_geocode.php?ajax=true&location=' + parameters; } if (type == 'valid-time') { url = 'jsonobjjs.php?gettime=1&s=&e='; } if (type == 'cases') { url = 'jsonobjjs.php?summarize=1&s=&e=&' + parameters; } loadingImage(true); if (window.XMLHttpRequest) { http_request = new XMLHttpRequest(); } else { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } http_request.onreadystatechange = function() { handle_json(op, type, http_request, parameters) }; http_request.open("GET", url, true); http_request.send(null); } function handle_json(op, type, http_request, parameters) { if (http_request.readyState == 4) { if (type == 'cases') { cases = eval(http_request.responseText); if (!cases) { loadingImage(false); } if (op == 'add') { addMarkers(cases); } if (op == 'remove') { removeMarkers(cases); } } if (type == 'address') { coords = eval( "(" + http_request.responseText + ")"); changeView(coords, parameters); } if (type == 'valid-time') { validTime = http_request.responseText; div = document.getElementById('ibox'); div.innerHTML = validTime; loadingImage(false) } } } function createMarkerClickHandler(marker, pointData) { return function() { if (pointData.case_no < 9999999) { pointData.case_no = '0' + pointData.case_no; } marker.openInfoWindowHtml( '

' + pointData.occ_date + '

'+pointData.address); return false; }; } function createMarker(pointData, caseId) { var latlng = new GLatLng(pointData.latitude, pointData.longitude); var icon = new GIcon(); icon.image = 'crime-icons/' + pointData.crime_type + '_btn.png'; icon.shadow = 'crime-icons/shadow.png'; icon.iconSize = new GSize(18, 19); icon.iconAnchor = new GPoint(9, 9); icon.infoWindowAnchor = new GPoint(11, 7); opts = { "icon": icon, "clickable": true, "labelText": pointData.crime_type, "labelOffset": new GSize(-9, -9) }; var marker = new GMarker(latlng, opts); var handler = createMarkerClickHandler(marker, pointData); GEvent.addListener(marker, "click", handler); var listItem = document.createElement('li'); listItem.setAttribute("id", caseId); listItem.innerHTML = '' + pointData.address + ''; listItem.getElementsByTagName('a')[0].onclick = handler; fillLists(listItem); return marker; } function fillLists(listItem) { var alpha = document.getElementById('alpha'); var beta = document.getElementById('beta'); if (alpha.getElementsByTagName('li').length > beta.getElementsByTagName('li').length) { beta.appendChild(listItem); } else { alpha.appendChild(listItem); } } function windowHeight() { // Standard browsers (Mozilla, Safari, etc.) if (self.innerHeight) return self.innerHeight; // IE 6 if (document.documentElement && document.documentElement.clientHeight) return document.documentElement.clientHeight; // IE 5 if (document.body) return document.body.clientHeight; // Just in case. return 0; } function handleResize() { var hnfHeight = document.getElementById('header').offsetHeight + document.getElementById('horizontal').offsetHeight; var leftOver = windowHeight() - hnfHeight - 10; document.getElementById('map-wrapper').style.height = leftOver - 54 + 'px'; document.getElementById('map').style.height = leftOver - 69 + 'px'; } function init() { handleResize(); map = new GMap(document.getElementById("map")); map.addControl(new GSmallMapControl()); map.setCenter(new GLatLng(centerLatitude, centerLongitude), startZoom); map.addControl(new GMapTypeControl()); manager = new MarkerManager(map); request('get', 'valid-time'); } function cityLimits() { li = document.getElementById('city-limits'); if (li.firstChild.id == 'nav014') { li.firstChild.id = 'nav015'; kmz = new GGeoXml("http://www.fresnobee.com/static/crime/FresnoCityLimits.kmz"); map.addOverlay(kmz); } else { if (li.firstChild.id == 'nav015') { li.firstChild.id = 'nav014'; map.removeOverlay(kmz); } } } function addMarkers(markers) { // This is a sorting trick, don't worry too much about it. markers.sort(function(a, b) { return (a.abbr > b.abbr) ? +1 : -1; }); batch = []; for(id in markers) { var continueFlag = 0; if (markers[id].latitude == '') { continue; } caseId = markers[id].case_no + "-" + markers[id].ucrcode; for(code in uniquePoints.caseId) { if (uniquePoints.caseId[code] == caseId) { continueFlag = 1; break; } } if (continueFlag) { continue; } var marker = createMarker(markers[id], caseId); batch.push(marker); uniquePoints.markerId.push(marker); uniquePoints.caseId.push(caseId); } manager.addMarkers(batch, 11); manager.refresh(); loadingImage(false); handleResize(); } function removeMarkers(markers) { markers.sort(function(a, b) { return (a.abbr > b.abbr) ? +1 : -1; }); var alpha = document.getElementById('alpha'); var beta = document.getElementById('beta'); for(id in markers) { caseId = markers[id].case_no + "-" + markers[id].ucrcode; for(code in uniquePoints.markerId) { if (uniquePoints.caseId[code] == caseId) { manager.removeMarker(uniquePoints.markerId[code]); li = document.getElementById(caseId); li.parentNode.removeChild(li); uniquePoints.caseId.splice(code, 1); uniquePoints.markerId.splice(code, 1); } } } manager.refresh(); loadingImage(false); handleResize(); } function clearMarkers() { manager.clearMarkers(); var list = document.getElementById('crime-list'); uniquePoints.markerId = new Array(); uniquePoints.caseId = new Array(); while (list.firstChild) { list.removeChild(list.firstChild); } } function changeView(coords, address, op) { if (houseMarker != '') { manager.removeMarker(houseMarker); } if (op != 'clear') { var latlng = new GLatLng(coords.latitude, coords.longitude); var icon = new GIcon(); icon.image = 'crime-icons/house_btn.png'; icon.shadow = 'crime-icons/shadow.png'; icon.iconSize = new GSize(18, 19); icon.iconAnchor = new GPoint(9, 9); icon.infoWindowAnchor = new GPoint(11, 7); opts = { "icon": icon, "clickable": true, "draggable": true }; houseMarker = new GMarker(latlng, opts); var handler = function () { houseMarker.openInfoWindowHtml(unescape(address) + "
Kansas City, MO
This item is draggable."); }; GEvent.addListener(houseMarker, "click", handler); manager.addMarker(houseMarker, 0, 17); if (coords.precision == 'address') { map.setCenter(latlng, 13); } if (coords.status == 602) { alert("Unable to find street address"); } loadingImage(false); } else { map.setCenter(new GLatLng(centerLatitude, centerLongitude), startZoom); } } function detectEmptyBox(contents) { if (contents == '') { changeView(null, null, 'clear'); } } window.onresize = handleResize; window.onload = init; window.onunload = GUnload;