var map = null;
var markers = new Array();
var MAP_WIDTH = 850;
var MAP_HEIGHT = 500;

function initialize()
{
	$('#crime_map').css('height', MAP_HEIGHT );
	bindFilterEvents();
	
	map = new google.maps.Map2(document.getElementById("crime_map"));
	map.addControl( new google.maps.LargeMapControl() );
	map.setCenter(new google.maps.LatLng( 37.229, -80.4237), 15);
	plotCrimes();

	if( window.location.hash ) {
		openCase( window.location.hash );
	}
}
$(document).ready(initialize);

function bindFilterEvents()
{
	$('#crime_form')[ 0 ].reset();
	$('.crime_check').attr('checked', true);
	$('.crime_check').click(function() {
			var id = $(this).attr('id').substr( 6 );
			crimes[ id ].checked = $(this).attr('checked');
			filterMarkers();
		});

	$( '#clear_crimes' ).click(function() { checkCrimeFilters( false ) });
	$( '#check_crimes' ).click(function() { checkCrimeFilters( true ) });

	$( '#place_filter' ).change(filterMarkers );
	$( '#date_filter' ).change(filterMarkers );
}

function checkCrimeFilters( val ) {
	$('.crime_check').attr('checked', val);
	$('.crime_check').each(function()
	{
		var id = $(this).attr('id').substr( 6 );
		crimes[ id ].checked = val;
	});
	filterMarkers();
}

function openCase( hash ) {
	num = hash.substring( 1 );
	for( var k in places ) {
		var the_crimes = places[k].crimes;
		for( c in the_crimes ) {
			if( the_crimes[c].caseNumber == num ) {
				markers[ k ].openInfoWindowHtml( caseInfo( the_crimes[c], k ), { maxWidth: '475' } );
				return;
			}
		}
	}
}

//use json objects
function plotCrimes() {
	if(places == null)
		return;
		
	for( var k in places ) {
		c = places[k];
		markers[k] = createMarker( c, k );
		map.addOverlay(markers[k]);
	}
}

function createMarker( c, i ) {
	marker = new google.maps.Marker( new google.maps.LatLng( c.latitude, c.longitude ) );
	google.maps.Event.addListener( marker, "click", function() {
		this.openInfoWindowHtml( getCrimeHtml( c, i ), { maxWidth: '475' } );
	});
	return marker;
}

function getCrimeHtml( location, markerIndex ) {
	var last = "";


	//var wrap = $(document.createElement('div'));
	//wrap.attr('id', locationFormat( location ) + '-list');
	var wrap = $('<div id="'+ locationFormat( location ) + '-list"></div>');
	
	wrap.html( getLocName( location ) );
	
	var reports = filter( location.crimes );
	if( !reports ) return false;
	var list_wrap = $('<div class="crime_list"></div>');
	var list = $('<ul></ul>');
	$.each(reports, function() {
			var date = this.date.substring(0, 10);
			if(date != last) {
				last = date;
				list_wrap.append( list );
				list = $('<ul></ul>');
				var dateNode = $('<p style="font-style: italic;">'+dateFormat( date )+'</p>');
				list_wrap.append( dateNode );
			}
			list.append( createListItem( location.id, this, markerIndex ) );
		});
	list_wrap.append( list );
	wrap.append( list_wrap );
	return '<div id="'+ locationFormat( location ) + '-list">'+wrap.html()+'</div>';
}

function createListItem( id, r, markerIndex ) {
	var a = $('<a href="#' + r.caseNumber+'">'+r.caseNumber+': </a>');

	var li = $('<li>' + crimes[r.crimeId].name + '</li>');
	li.prepend(a);
	$('a', li).live('click', function()
	{
		markers[markerIndex].openInfoWindowHtml( caseInfo( r, markerIndex ), { maxWidth: '475' } );
	});
	return li;
}

function getLocName( location ) {
	var locName = '<p style="font-weight: bold;">'+location.name+'</p>';
	return locName;
}

function dateFormat( date ) {
	var months = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ];
	a = date.split('-');
	return months[ (a[1] * 1) - 1 ] + " " + a[2] + ", " + a[0];
}

function locationFormat( loc ) {
	return 'cases-' + loc.id;
}

function caseInfo( r, markerIndex ) {
	var div = $('<div></div>');
	
	var caseInfo = $('<p>Case #'+r.caseNumber+'</p>');
	caseInfo.prepend('<br/>');
	caseInfo.prepend($('<em>'+dateFormat( r.date.split(' ')[0] )+'</em>'));

	var caseDesc = $('<div>'+r.description+'</div>');

	var back = $('<a id="'+locationFormat( location ) + '-back" href="#crime-list">&laquo; Back</a>');

	div.append(getLocName( places[r.placeId] ) );
	div.append( caseInfo );
	div.append( caseDesc );
	div.append( back );
	$('a', div).live('click', function() {
			markers[markerIndex].openInfoWindowHtml( getCrimeHtml( places[r.placeId], markerIndex ), { maxWidth: '475' } );
	});
	
	return '<div>'+div.html()+'</div>';
}

function filter( crime_list ) {
	var df = dateFilter();

	var ret = [];
	for( var k in crime_list ) {
		var c = crime_list[k];
		var dc = c.date.split(" ");
		dc[0] = dc[0].split("-");
		dc[1] = dc[1].split(":");
		dc = new Date( dc[0][0], dc[0][1] - 1, dc[0][2], dc[1][0], dc[1][1], dc[1][2] );
		if( crimes[ c.crimeId ].checked && (dc - df) > 0 ) {
			ret.push( c );
		}
	}

	if( ret.length > 0 ) {
		return ret;
	}
	else
		return false;
}

function dateFilter( crime_date ) {
	var x = $( '#date_filter' ).val();
	if( x <= 0 )
		return 0;

	var today = new Date();
	today = today - (today.getHours() * 3600 + today.getMinutes() * 60 + today.getSeconds()) * 1000;
	today = new Date( today );
	var df = new Date( today );

	if( x == "1_week" ) {
		df = today - 604800000;
	} else if( x == "1_month" || x == "3_months" || x == "6_months" ) {
		var dm = 0;
		switch( x ) {
			case "1_month":
				dm = 1;
				break;
			case "3_months":
				dm = 3;
				break;
			case "6_months":
				dm = 6;
				break;
		}
		
		var y = today.getFullYear();
		var m = today.getMonth() - dm;
		if( m < 0 ) {
			m += 12;
			y--;
		}
		df.setFullYear( y, m, today.getDate() );
	} else {
		df.setFullYear( today.getFullYear() - 1, today.getMonth(), today.getDate() );
	}

	return df;
}

function filterMarkers() {
	map.closeInfoWindow();
	var place_filter = $( '#place_filter' ).val();
	$.each(	markers, function(i, val) {
		if (val !== undefined)
		{
			if( filter( places[ i ].crimes ) ) {
				if( place_filter > 0 ) {
					if( i == place_filter ) {
						markers[i].show();
						markers[i].openInfoWindowHtml( getCrimeHtml( places[ place_filter ], i ), { maxWidth: '475' } );	
					} else {
						markers[i].hide();
					}
				} else {
					markers[i].show();
				}
			} else {
				markers[i].hide();
			}
		}
	});
}

if( window.location.hash != "#no-map" ) {
	google.load("maps", "1");
	google.setOnLoadCallback(initialize);
}

