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;