var geocoder, map='', markersarray = new Array, markersgroup = new Array, firmsearch = "", firmlist = new Array, initialized = false, quarter='09-3Q', firm = '', searchType = '', moveMapListener, loadedXML;

//ONLOAD ONRESIZE STUFF
window.onload = function () { 
	initialize(quarter, '', ''); 
}
window.onresize = function () { if (initialized == true) resizeMap(); }
window.unload = function () { if (initialized == true) GUnload(); }

////RESIZE MAP
function resizeMap() {
if (typeof window.innerWidth != 'undefined')	{
		viewportwidth = window.innerWidth,
		viewportheight = window.innerHeight
	}
		 
	// IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)
		
	else if (typeof document.documentElement != 'undefined'
	 && typeof document.documentElement.clientWidth !=
	 'undefined' && document.documentElement.clientWidth != 0) {
		viewportwidth = document.documentElement.clientWidth,
		viewportheight = document.documentElement.clientHeight
	}
				
	document.getElementById("map").style.height = viewportheight - document.getElementById("map_nav").clientHeight + "px";
	
	if(map!='') {
		map.checkResize();
	}
	
	
}


function initialize(q, f, t) {
	resizeMap();
	if(q != quarter && q != '') loadFirms(searchType);
	if(q!='') quarter = q;
	firm = f;
	searchType = t;	
	
	if (GBrowserIsCompatible()) {
		if (map=='') {
			geocoder = new GClientGeocoder();
			map = new GMap2(document.getElementById("map_canvas"));
			map.setCenter(new GLatLng(39.833333,-98.583333), 4);
			map.setUIToDefault();
			map.setMapType(G_PHYSICAL_MAP);
		}
		//map.clearOverlays();
		bounds = map.getBounds();
		southWest = bounds.getSouthWest();
		northEast = bounds.getNorthEast();
		loadXML('http://www.publicintegrity.org/project_assets/transpo_lobby/map/php/getData.php?qtr=' + quarter + '&firm=' + escape(firm) + '&type=' + searchType + '&latl=' + southWest.lat() + '&latr=' + northEast.lat() + '&lngt=' + southWest.lng() + '&lngb=' + northEast.lng() + '&zoom=' + map.getZoom() + '&browser=' + navigator.userAgent.toLowerCase().search(new RegExp('msie')));
		//addMarkers(q, f, t, southWest.lat(), northEast.lat(), southWest.lng(), northEast.lng(), map.getZoom());
		addEvents();
		
		initialized = true;
	}
}


function addEvents() {
	GEvent.clearListeners(map, 'moveend');
	GEvent.clearListeners(map, 'grabend');
	GEvent.clearListeners(map, 'zoomend');
	GEvent.clearListeners(map, 'infowindowopen');
	GEvent.clearListeners(map, 'infowindowclose');
		
	if(firm=='') {
		moveMapListener = GEvent.addListener(map, 'moveend', function() {
			initialize(quarter, firm, searchType);
		});
		grabMapListener = GEvent.addListener(map, 'grabend', function() {
			initialize(quarter, firm, searchType);
		});
		zoomMapListener = GEvent.addListener(map, 'zoomend', function(oldLevel, newLevel) {
			initialize(quarter, firm, searchType);
		});
		GEvent.addListener(map, 'infowindowopen', function() {
			GEvent.removeListener(moveMapListener);
			GEvent.removeListener(grabMapListener);
			GEvent.removeListener(zoomMapListener);
		});
		GEvent.addListener(map, 'infowindowclose', function() {
			moveMapListener = GEvent.addListener(map, 'moveend', function() {
			initialize(quarter, firm, searchType);
			});
			grabMapListener = GEvent.addListener(map, 'grabend', function() {
				initialize(quarter, firm, searchType);
			});
			zoomMapListener = GEvent.addListener(map, 'zoomend', function(oldLevel, newLevel) {
				initialize(quarter, firm, searchType);
			});
		});	
	}
}

//CREATE CLUSTER MARKERS
function createClusteredMarker(markers, q) {
	 //if (navigator.userAgent.toLowerCase().search(new RegExp('msie')) == -1) 
	 var newIcon = MapIconMaker.createMarkerIcon({width: 32, height: 32, primaryColor:'#FF7F00', strokeColor:'#000000', cornerColor:'#FF7F00' });
/*	else {
		var newIcon = new GIcon(G_DEFAULT_ICON); 
		newIcon.shadow = "";
	}
*/	
	var marker = new GMarker(markers[0].latlng, {icon: newIcon});
	//var marker = new GMarker(markers[0].latlng);

	var html = '<h3>' +  markers[0].location + '</h3>';
	var money = 0;
	var firm = "";
	var trucking = '0';
	for(var m=0; m<markers.length; m++) {
			
			money+=Number(markers[m].money);
			html = html + '<p><b>Lobbyist:</b>&nbsp;' + markers[m].firm + '<br /><a href=\"http://www.publicintegrity.org/investigations/transportation_lobby/pages/clients/?n=' + encodeURIComponent(markers[m].firm) + '\" target=\"_blank\">See lobbyist\'s clients</a><br /><b>Client:</b>&nbsp;' + markers[m].client;
			if(markers[m].trucking=='1') {
				html += '<sup>2</sup>';
				trucking = '1';
			}
			
			html += '<br/><b>Type:</b>&nbsp;' + markers[m].type + '<br /><b>Total contract with lobbyist:</b>&nbsp;' + addCommas(markers[m].money) + '<sup>1</sup><br /><b>Quarter: </b>' + markers[m].qtr;
			
			if(markers[m].projects != '') html = html + "<br /><b>Projects lobbied for:</b>&nbsp;" + markers[m].projects + '</p>';
			
			firm = firm + markers[m].firm;
	}
	
	html += '<p><sup>1</sup>The total dollar amounts listed for contracts usually include lobbying on multiple issues, including transportation. Lobbyists are not required to determine how much money in a given contract is devoted to a specific issue.</p>';
	if(trucking=='1') html += '<p><sup>2</sup>Primarily focused on trucking capacity.</p>';

		GEvent.addListener(marker, 'click', function() {
					center = map.getCenter();
					fromSearch = document.getElementById("mapmenu_search").style.display;
					marker.openInfoWindowHtml('<p>Click the maximize (+) button to the right to see who\'s lobbying in ' + markers[0].location + '.</p>',
					{maxContent: html, 
						 maxTitle: "Lobbying in " + markers[0].location, maxWidth: 200});
					var iw = map.getInfoWindow();
					
				
				});

		markersgroup.push(marker);
	}

// ADD COMMAS
function addCommas(number) { 
	if(number!='1') {
		var temp = new String, count = 0, formated = '$';
		var tempn=number.length+(Math.round(number.length/3));
		var comma;
		
		
		for(var i=number.length-1; i>-1; i--) {
			if(count == 3) {
				temp += ',';
				temp +=  number.charAt(i);
				count = 0;
				count++;
			}
			else {
				temp += number.charAt(i);
				count++;
			}
			
		}
		
		for(var i=temp.length; i>-1; i--) {
			formated += temp.charAt(i);	
		}
		return formated;
	} else return 'Less than $5,000';

}


/// LOAD XML
function loadXML(url) {
	$.ajax({
		type: "GET",
		//beforeSend: function() { $('#search_firm').html('Loading firm list ...'); },
		url: url,
		dataType: 'xml',
		success: function(xml) { 
			addMarkers(xml);
		}
	});
}

function addMarkers(xml) {
	markersgroup = new Array, markersarray = new Array, firmlist = new Array;
	map.clearOverlays();
	
	$(xml).find("REGISTRANT").each(function() { 
		mapfirmname = $(this).attr("name");
		
		$(this).find("CLIENT").each(function() {
											
			maplocation = $(this).attr("location");
			var tempLat = $(this).attr("lat");
			var tempLng = $(this).attr("lng");
			//if(tempLat == '') tempLat = 0;
			//if(tempLng == '') tempLng = 0;
			
			mapmarkerpoint = new GLatLng(tempLat, tempLng);
			mapclient = $(this).attr("name");
			mapmoney = $(this).attr("money");
			mapqtr = $(this).attr("qtr");
			maptype = $(this).attr("type");
			if($(this).attr("projects") != ' '){
				mapprojects = $(this).attr("projects");
			} else mapprojects = '';
			maptrucking = $(this).attr("trucking");
				
			var marker = ({location: maplocation, latlng: mapmarkerpoint, firm: mapfirmname, client: mapclient, money: mapmoney, qtr: mapqtr, type: maptype, projects: mapprojects, trucking: maptrucking});
			var latlngHash = (marker.latlng.lat().toFixed(6) + "" + marker.latlng.lng().toFixed(6));
			latlngHash = latlngHash.replace(".","").replace(".", "").replace("-","");
			if (markersarray[latlngHash] == null) {
				markersarray[latlngHash] = [];
			} 
			markersarray[latlngHash].push(marker);						
		});
	});

	for(var hashnum in markersarray) {
		var marker = markersarray[hashnum];
			createClusteredMarker(marker, quarter);
	}
	
	for(var markerIndex in markersgroup) {
		map.addOverlay(markersgroup[markerIndex]);
	}
	
}


function loadFirms(sType) {
	$.ajax({
		type: "GET",
		beforeSend: function() { $('#search_firm').html('Loading firm list ...'); },
		url: 'http://www.publicintegrity.org/project_assets/transpo_lobby/map/php/getFirms.php',
		dataType: 'xml',
		data: 'type=' + searchType +'&qtr=' + quarter,
		success: function(xml) { 
			searchType = sType;
			makeFirmList(xml); 
			//showMenu('mapmenu_search', 'showSearch');
		}
	});
	
}

// SEARCH FUNCTION
function makeFirmList(xml) {
	
	firmlist = new Array();
	
	$(xml).find("REGISTRANT").each(function() {
		firmlist.push($(this).attr('name'));
	});
			firmlist.sort();
			
			var letterssearch = "", letters = new Array(), firms = "";
			n=0;
			letters.push(0);
			for(i=0; i<firmlist.length; i++) {
				var templettercode = firmlist[i].toUpperCase().charCodeAt(0);
				if(letters[n]<templettercode) {
					n++;
					letters.push(templettercode);
					var templetter = String.fromCharCode(letters[n]);
					letterssearch = letterssearch + "<span id=\"search_nav\"><a href=\"#" + templetter + "\">" + templetter + "</a></span> | ";
				}
				if(i!=0){
					if(firmlist[i-1].toUpperCase().charCodeAt(0)<firmlist[i].toUpperCase().charCodeAt(0)) {
						var templetter = String.fromCharCode(letters[n]);
	
						firms = firms + "</ul>" + "<a name=\""+ templetter +"\" id=\"" + templetter + "\"></a>" + templetter + "<ul>";
					}
				}
	
				
				firms = firms + "<li onclick=\"initialize('" + quarter + "', '" + firmlist[i] + "', '" + searchType + "')\">" + firmlist[i] + "</li>";
	
			}
			
			n=0;
			letters.push(0);
	
			firmsearch = "<h3>Search by firm</h3> \
			<p>Select one of the top transportation lobbying firms from the list below to see their clients:</p><ul> \
			<li onclick=\"initialize('" + quarter + "', 'Akin Gump Strauss Hauer & Feld')\">Akin Gump Strauss Hauer & Feld</li> \
			<li onclick=\"initialize('" + quarter + "', 'Alcalde & Fay')\">Alcalde & Fay</li> \
			<li onclick=\"initialize('" + quarter + "', 'Ferguson Group')\">Ferguson Group</li> \
			<li onclick=\"initialize('" + quarter + "', 'Holland & Knight')\">Holland & Knight</li> \
			<li onclick=\"initialize('" + quarter + "', 'K&L Gates')\">K&L Gates</li> \
			<li onclick=\"initialize('" + quarter + "', 'Marlowe & Company')\">Marlowe & Company</li> \
			<li onclick=\"initialize('" + quarter + "', 'Patton Boggs LLP')\">Patton Boggs LLP</li> \
			<li onclick=\"initialize('" + quarter + "', 'Simon and Company')\">Simon and Company</li> \
			<li onclick=\"initialize('" + quarter + "', 'Van Scoyoc Associates')\">Van Scoyoc Associates</li> \
			<li onclick=\"initialize('" + quarter + "', 'McAllister & Quinn')\">McAllister & Quinn</li> \
			<li onclick=\"initialize('" + quarter + "', 'Smith Dawson & Andrews')\">Smith Dawson & Andrews</li> \
			</ul><p>Browse the full list of lobbying firms. Click on a name to see its clients:</p>";
			//<p>Reset firm list and map: </span><span onclick=\"initialize('09-1Q', '')\" style=\"padding: 5px; margin: 5px; cursor: pointer; background-color: rgb(204, 204, 204)\">1Q 2009</span><span onclick=\"initialize('09-2Q', '')\" style=\"padding: 5px; margin: 5px; cursor: pointer; background-color: rgb(204, 204, 204)\">2Q 2009</p><span onclick=\"initialize('09-3Q', '')\" style=\"padding: 5px; margin: 5px; cursor: pointer; background-color: rgb(204, 204, 204)\">3Q 2009</p>";
			
			
			
			firmsearch = firmsearch + letterssearch + "<ul>" + firms + "</ul>";
			
			$('#search_firm').html(firmsearch);
	
}

//ZOOM TO AREA
function areaSearch(l, z) {
		geocoder.getLatLng(
			l,
			function(point) {
			  if (!point) {
				document.getElementById("e").innerHTML = document.getElementById("e").innerHTML + "<br />" + markers.location + " not found";
			  } else {
				map.setCenter(point, Number(z));
	   		  }
			}
		);	
}

