GEvent.addDomListener(window,'load',loadGoogleMap);
GEvent.addDomListener(window,'unload',GUnload);

var queryStrings = location.search.replace (/^\?/, "").split ("&");
var parameters = new Object ();

for (var i=0; i<queryStrings.length; i++) {
	var queryString = queryStrings[i].split ("=");
	parameters[queryString[0]] = decodeURIComponent (queryString[1].replace (/\+/g, " "));
}


//this is for the directions forms added to each marker 
var DirectionsTemplate = jsonToDom({
	el:'div',att:{Class:'directions'},ch:[
		{txt:'Directions: '},
		{el:'span',att:{Class:'directionsTo'},ch:[
			{txt:'To Here'}
		]},
		{txt:' - '},
		{el:'span',att:{Class:'directionsFrom'},ch:[
			{txt:'From Here'}
		]},
		{el:'form',att:{Class:'toForm',target:'_blank',method:'get',action:'http://maps.google.com/maps'},ch:[
			{el:'input',att:{type:'hidden',name:'daddr'}},
			{el:'input',att:{type:'hidden',name:'dll'}},
			{txt:'Start Address'},
			{el:'br'},
			{el:'input',att:{type:'text',name:'saddr'}},
			{el:'br'},
			{el:'input',att:{type:'submit',value:'Get Directions'}}
		]},
		{el:'form',att:{Class:'fromForm',target:'_blank',method:'get',action:'http://maps.google.com/maps'},ch:[
			{el:'input',att:{type:'hidden',name:'saddr'}},
			{el:'input',att:{type:'hidden',name:'sll'}},
			{txt:'End Address'},
			{el:'br'},
			{el:'input',att:{type:'text',name:'daddr'}},
			{el:'br'},
			{el:'input',att:{type:'submit',value:'Get Directions'}}
		]}		
	]
});

//check for google maps compatibility, if so, load xml
function loadGoogleMap(){
	if(!GBrowserIsCompatible()){
		alert('Sorry, the Google Maps API is not compatible with this browser.');
		return;
	}else{
		var md = createMap();
		loadXMLMap('/download/1008/interactive_map/map.xml?timestamp=' + new Date ().valueOf (), md.map, md.icon, md.sidebar);
	}
}

//create map, icon and sidebar
function createMap(){
	var map = new GMap2(document.getElementById("map"));
	var icon = new GIcon();
	
	map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    //map.setCenter(new GLatLng(45.52, -122.71), 10);
    
    icon.image = "/download/796/code/images/google_marker.png";
    icon.shadow = "/download/796/code/images/shadow.png";
    icon.iconSize = new GSize(23, 28);
    icon.shadowSize = new GSize(38, 26);
    icon.iconAnchor = new GPoint(9, 34);
    icon.infoWindowAnchor = new GPoint(9, 2);
    icon.infoShadowAnchor = new GPoint(18, 25);
	
	var sidebar = document.getElementById('mapSidebar');
	
	return {map:map,icon:icon,sidebar:sidebar};
}

//load XML via XHR
function loadXMLMap(url, map, icon, sidebar){
    var request = GXmlHttp.create();
    request.open("GET", url, true);
	var handler = GEvent.callbackArgs(request, handleRequest, map, icon, sidebar);
	request.onreadystatechange = handler;
	request.send(null);
}

//process XML and initialize map
var lastMap = null;
var lastIcon = null;
var lastSidebar = null;
var lastGroups = null;
var createdGroups = new Object ();
function repositionMap (county) {
	var groups = lastGroups;
	var sidebar = lastSidebar;
	var icon = lastIcon;
	var map = lastMap;

	for (var i=0; i<groups.length; i++) {
		var countyName = groups[i].attributes.getNamedItem ("name").value;
		if (countyName == county) {
			map.setCenter(new GLatLng(parseFloat(groups[i].getAttribute('lat')),parseFloat(groups[i].getAttribute('lng'))),parseInt(groups[i].getAttribute('zoom')))
			if (!createdGroups['g_' + i]) {
				var gh = new GroupHandler(map);
				var acc = new Accordion();
				createGroup(gh,groups[i],map,icon,sidebar,acc);
				createdGroups['g_' + i] = true;
				acc.init(sidebar,600);
			}
		}
	}
}
function handleRequest(map, icon, sidebar){
	if(this.readyState == 4){
		if(!(this.status == 200 || this.status == 304)){
			alert('Google Maps Could Not Load.\r\nTry refreshing the page to load the map.');
			return;
		}
		var xmlDoc = this.responseXML;
		
		var groups = xmlDoc.getElementsByTagName('group');
		
		for (var i=0; i<groups.length; i++) {
			var countyName = groups[i].attributes.getNamedItem ("name").value;
			if (countyName == parameters.county) {
				map.setCenter(new GLatLng(parseFloat(groups[i].getAttribute('lat')),parseFloat(groups[i].getAttribute('lng'))),parseInt(groups[i].getAttribute('zoom')))
				var gh = new GroupHandler(map);
				var acc = new Accordion();
				createGroup(gh,groups[i],map,icon,sidebar,acc);
				createdGroups['g_' + i] = true;
				acc.init(sidebar,600);
			}
		}
		
		lastGroups = groups;
		lastSidebar = sidebar;
		lastIcon = icon;
		lastMap = map;
	}
}

//create the groups
function createGroup(groupHandler, group, map, icon, sidebar, accordion){
	var name = group.getAttribute('name');
	var lat = group.getAttribute('lat');
	var lng = group.getAttribute('lng');
	var zoom = group.getAttribute('zoom');
	var markers = group.getElementsByTagName('marker');
	var currentGroup = groupHandler.addGroup(lat,lng,zoom);
	
	sidebar.innerHTML = "";
	var sidebarLink = document.createElement('div');
	applyAttribute(sidebarLink,'class','regionTitle');
	sidebarLink.appendChild(document.createTextNode(name));
	var officeList = document.createElement('div');
	//officeList.setAttribute('class','offices');
	applyAttribute(officeList,'class','offices');
	var list = document.createElement('ul');
	officeList.appendChild(list);
	sidebar.appendChild(sidebarLink);
	sidebar.appendChild(officeList);
	
	var ghSwap = GEvent.callbackArgs(groupHandler,groupHandler.showGroup,currentGroup);
	//GEvent.addDomListener(sidebarLink,'click',GEvent.callbackArgs(sidebarLink,handleGroupClick,groupHandler,currentGroup,accordion));
	//GEvent.addDomListener(sidebarLink,'click',GEvent.callbackArgs(accordion,accordion.swap,sidebarLink,ghSwap));
	
	for(var i = 0; i < markers.length; i++){
		groupHandler.addMarker(createMarker(markers[i], map, icon, list),currentGroup);
	}
	if(currentGroup != groupHandler.active) groupHandler.hideGroup(currentGroup);
}

//create the markers
function createMarker(marker, map, icon, list){
	var name = marker.getAttribute('sidebarName');
	var lat = marker.getAttribute('lat');
	var lng = marker.getAttribute('lng');
	var gMarker = new GMarker(new GLatLng(lat,lng),icon);
	var tooltip = new Tooltip(gMarker,name,5);
	gMarker.isInfoWindowOpen = false;
	gMarker.tooltip = tooltip;
	
	var showttfunc = GEvent.callback(gMarker,showTooltip);
	var hidettfunc = GEvent.callback(tooltip,tooltip.hide);
	
	var sidebarLink = document.createElement('li');
	applyAttribute(sidebarLink,'tabindex',0);
	sidebarLink.appendChild(document.createTextNode(name));
	list.appendChild(sidebarLink);
	
	createTabs(marker,gMarker,lat,lng);
	
	GEvent.addDomListener(sidebarLink,'mouseover',showttfunc);
	GEvent.addDomListener(sidebarLink,'mouseout',hidettfunc);
	GEvent.addDomListener(sidebarLink,'click',GEvent.callback(gMarker,showTabs));	
	GEvent.addListener(gMarker,'mouseover',showttfunc);
	GEvent.addListener(gMarker,'mouseout',hidettfunc);
	GEvent.addListener(gMarker,'infowindowopen',function(){this.isInfoWindowOpen = true});
	GEvent.addListener(gMarker,'infowindowclose',function(){this.isInfoWindowOpen = false});
	GEvent.addListener(gMarker,'click',showTabs);
	
	map.addOverlay(gMarker);
	map.addOverlay(gMarker.tooltip);
	
	return gMarker;
}

//create the tabs
function createTabs(nodeMarker,gMarker,lat,lng){
	var tabs = nodeMarker.getElementsByTagName('tab');
	var gTabs = [];
	
	var mainContainer = document.createElement('div');
	var html = "";
	for (var i=0, c=tabs[0].childNodes.length; i<c; i++) {
		html += tabs[0].childNodes[i].nodeValue;
	}
	mainContainer.innerHTML = html;
	var directions = DirectionsTemplate.cloneNode(true);
	mainContainer.appendChild(directions);	
	
	gTabs.push(new GInfoWindowTab(tabs[0].getAttribute('label'),mainContainer));
	for(var i = 1; i < tabs.length; i++){
		var container = document.createElement('div');
		container.innerHTML = tabs[i].childNodes[0].nodeValue;
		gTabs.push(new GInfoWindowTab(tabs[i].getAttribute('label'),container));
	}
	
	var forms = directions.getElementsByTagName('form');
	var spans = directions.getElementsByTagName('span');
	gMarker.dirForms = [forms[0],forms[1]];
	gMarker.dirSpans = [spans[0],spans[1]];
	
	gMarker.dirForms[0].daddr.value = lat + ',' + lng;
	gMarker.dirForms[1].saddr.value = lat + ',' + lng;
	
	gMarker.toListener = GEvent.callbackArgs(gMarker,swapDirections,0);
	gMarker.fromListener = GEvent.callbackArgs(gMarker,swapDirections,1);
	
	/* Google Maps clears all event listeners on the elements in the infowindow
	 * everytime the infowindow closes.  Therefore, we must add the event
	 * listeners every time the infowindow opens.*/
	GEvent.addListener(gMarker,'infowindowopen',addDirectionListeners);
	gMarker.tabs = gTabs;
}

//group click handler
function handleGroupClick(groupHandler,groupId,accordion){
	accordion.swap(this,GEvent.callbackArgs(groupHandler,groupHandler.showGroup,groupId));
}

//makrer,sidebar mouseover handler
function showTooltip(){
	if(!(this.isInfoWindowOpen) && !(this.isHidden())) this.tooltip.show();
}

//marker infowindowopen handler
function addDirectionListeners(){	
	GEvent.clearListeners(this.dirSpans[0],'click');
	GEvent.clearListeners(this.dirSpans[1],'click');
	GEvent.addDomListener(this.dirSpans[0],'click',this.toListener);
	GEvent.addDomListener(this.dirSpans[1],'click',this.fromListener);
}

//directions click handler
function swapDirections(show){
	var hide = show === 0 ? 1 : 0;
	addClassToElement(this.dirForms[show],'active');
	removeClassFromElement(this.dirForms[hide],'active');
	addClassToElement(this.dirSpans[show],'inactive');
	removeClassFromElement(this.dirSpans[hide],'inactive');
	this.openInfoWindowTabs(this.tabs);
}

//marker click handler
function showTabs(){
	this.tooltip.hide();
	this.openInfoWindowTabs(this.tabs);
}
