var start_time = "";
var end_rpc = "";
var end_time = "";

function find_view()
{

	body.style.cursor = "progress";
	var mydate = new Date();
	cur_uid = mydate.getTime();

	var center = map.getCenter( );
	//var span = map.getSpanLatLng();
	var bounds = map.getBounds( );
  var span   = bounds.toSpan( );
  var SW     = bounds.getSouthWest( );
  var NE     = bounds.getNorthEast( );
	var query = "bound[minlon]=" + SW.lng( ) +
		"&bound[minlat]=" + SW.lat( ) +
		"&bound[maxlon]=" + NE.lng( ) +
		"&bound[maxlat]=" + NE.lat( ) +
		"&span[lon]=" + span.lng( ) +
		"&span[lat]=" + span.lat( ) +
		"&center[lon]=" + center.lng( ) +
		"&center[lat]=" + center.lat( ) +
		"&uid=" + cur_uid +
		"&method=" + method;

logit("Query: " + query);
	start_time = new Date();
	var opts = {method: "post", parameters: query, onComplete: process_view};
	new Ajax.Request(serviceuri, opts);
	permalink.href = base_href + center.y + "," + center.x + "," + map.getZoom();

}


function process_view(myrequest) {
	end_rpc = new Date();
	logit("Query returned in " + (end_rpc - start_time) / 1000 + " seconds.");
	start_time = new Date();
	try { eval("var records = " + myrequest.responseText); }
	 catch (e) { /* do nothing */ }
	if(parseInt(records.meta.uid) != cur_uid)
	{
		logit("This request is not the most recent one... bailing out.");
		return true;
	}
	var lon;
	var lat;
	var zoomlevel;
	var removed = false;
	if(parseInt(records.meta.recenter) == 1) {
		if(movelistener.instance) { GEvent.removeListener(movelistener);
			removed = true;
		}
			lon = parseFloat(records.meta.lon);
			lat = parseFloat(records.meta.lat);
			zoomlevel = parseInt(records.meta.zoomlevel);
			map.setCenter( new GLatLng(lon, lat), zoomlevel );
			permalink.href = base_href + lat + "," + lon + "," + zoomlevel;
			
			addSearchHistory();
		if(removed) {
			movelistener = GEvent.addListener(map, "moveend", find_view);
		}
	}

	CZmarkers.editMarkers(records);
	Behaviour.apply();

	end_time = new Date();
	logit("Plotting finished in " + (end_time - start_time) / 1000 + " seconds.");
	body.style.cursor = "";
}



var debug_viewer;
var map;
var serviceuri = base_href + "actions/multiserv.php";
var method = "array";
//var method = "xml";
//var method = "code";
var baseIcon;
var movelistener;
var cur_uid;
var header;
var container;
var permalink;
var search_history_list;

Event.observe(window, "load", index_init);
//window.onload = index_init;
function handle_map_click(overlay, point)
{
	
	if(overlay)
	{
		if(movelistener.instance)
		{
			GEvent.removeListener(movelistener);
		}
		if(method == "array")
			try {
			overlay.openInfoWindowHtml( overlay.html);
			Behaviour.apply();
			} catch (e) { /* do nothing */ }
	}

}





function index_init(event)
{
	body = document.getElementsBySelector('body')[0];
	container = $('container');
	header = $('header');
	permalink = $('permalink');
	search_history_list = $('recent_search_list');
	if(window.attachEvent) {
		container.style.height = body.clientHeight - (parseInt(header.clientHeight) + 70) + "px";
	} else { 
		container.style.height = body.clientHeight - (header.clientHeight * 1.5) + "px";
	}
	baseIcon = new GIcon();
	baseIcon.shadow = "http://dichotomize.com/czmap/images/pushpins/shadow50.png";
	baseIcon.iconSize = new GSize(20, 34);
	baseIcon.shadowSize = new GSize(37, 34);
	baseIcon.iconAnchor = new GPoint(9, 34);
	baseIcon.infoWindowAnchor = new GPoint(9, 2);
	baseIcon.infoShadowAnchor = new GPoint(18, 25);
	baseIcon.image = "http://dichotomize.com/czmap/images/pushpins/001.png";
	debug_viewer = document.getElementById("debug_viewer");

	var publisher_id = "partner-pub-3100993675571290" ;
	var adsManagerOptions = {
	  maxAdsOnMap : 2,  
	  style: G_ADSMANAGER_STYLE_ADUNIT,
	// The channel field is optional - replace this field with a channel number   
	// for Google AdSense tracking  	
	  channel: '2'
	 };

	adsManager = new GAdsManager(map, publisher_id, adsManagerOptions);
	adsManager.enable();

  var mapOptions = {
    googleBarOptions : {
		style : "new",     
		adsOptions: {
		        client: "partner-pub-3100993675571290",
		        //channel: "AdSense for Search channel",
		        channel: "churchzip.com",
		        adsafe: "high",
		        language: "en"
       }
     }
	 };

	map = new GMap2(document.getElementById("map"), mapOptions);
	map.setCenter(new GLatLng(defaultlatitude, defaultlongitude ), defaultzoom);
	map.addControl(new GLargeMapControl());
	map.addControl(new GOverviewMapControl());
	map.addControl(new GMapTypeControl());
	map.setUIToDefault();
	map.enableGoogleBar();
	movelistener = GEvent.addListener(map, "moveend", find_view);
	GEvent.addListener(map, "click", handle_map_click);
	GEvent.addListener(map, "infowindowopen", function () {
		GEvent.removeListener(movelistener);
	});
	GEvent.addListener(map, "infowindowclose", function () {
		movelistener = GEvent.addListener(map, "moveend", find_view);

	});

	CZmarkers.create(120);

	 // Monitor the window resize event and let the map know when it occurs
	 if (window.attachEvent) { 
		window.attachEvent("onresize", function()
		{	
			container.style.height = body.clientHeight - (parseInt(header.clientHeight) + 70) + "px";
			GEvent.removeListener(movelistener);
			this.map.checkResize()
      map.enableGoogleBar();
			movelistener = GEvent.addListener(map, "moveend", find_view);
		} );
	 } else {
		window.addEventListener("resize", function()
			{
				container.style.height = body.clientHeight - (header.clientHeight * 1.5) + "px";
				GEvent.removeListener(movelistener);
				this.map.checkResize()
        map.enableGoogleBar();
				movelistener = GEvent.addListener(map, "moveend", find_view);
			} , false);
	 }

	
	var rules = {
	/*
	  '#marker_info .tab_title' : function (element)  {
	    Event.observe(element, "click", get_active_tab, false);
	  },
	  '#marker_info #edit_tab' : function (element) {
	    Event.observe(element, "click", edit_record, false);
	  },
		*/
		'dl.controls dt.title' : function (element) {
			Event.observe(element, "click", toggle_control_display);
			//Event.observe(element, "mouseover", hover_control);
			//Event.observe(element, "mouseout", unhover_control);
		},
		'#side_bar td.clickable' : function (element) {
			Event.observe(element, "click", trigger_info_bubble);
		},
		'#side_bar tr' : function (element) {
			Event.observe(element, "mouseover", hover_row);
			Event.observe(element, "mouseout", unhover_row);
		},
		'#search_history_list a' : function (element) {
			Event.observe(element, "click", revisit_history);
		}

	};

	Behaviour.register(rules);
	Behaviour.apply();
	//Event.observe($('query_button'), "click", do_search);
	find_view();

}

function revisit_history(event) {
	var target = Event.findElement(event, "A");
	Event.stop();
	return false;
}


function do_search(event) {
	body.style.cursor = "progress";
	var mydate = new Date();
	cur_uid = mydate.getTime();
	start_time = new Date();

	var uri = base_href + "actions/geoserv.php";
	var search = $('place_query').value;
	var cc = $('ccode').value;
	var params = "searchstring=" + escape(search) + "&cc=" + escape(cc) + 
		"&uid=" + cur_uid +
		"&method=" + method;

	var opts = {method : "post", parameters : params, onComplete : process_view};
	new Ajax.Request(uri, opts);

}

function addSearchHistory() {
	var query = $('place_query').value;
	var cc = $('ccode').value;
	var permahref = permalink.href;
	var list_items = search_history_list.childNodes;
	var item_html = "<a href=\"" + permahref + "/" + escape(query) + "/" + cc + "\" " + 
	"title=\"Revisit " + escape(query) + "\">" + query + "</a>";
	if(!list_items || list_items.length < 3) {
		new Insertion.Top(search_history_list, "<li>" + item_html + "</li>");
	} else {
		search_history_list.lastChild.innerHTML = item_html;
		search_history_list.insertBefore(search_history_list.lastChild, search_history_list.firstChild);
	}
}



function toggle_control_display(event) {
	var target = Event.findElement(event, "DT");
	var control = target.nextSibling;
	while(control && control.nodeName != "DD") {
		control = control.nextSibling;
	}
	if(control.style.display != "none") {
		control.style.display = "none";
		Element.removeClassName(target, "dt_open");
	} else {
		control.style.display = "block";
		Element.addClassName(target, "dt_open");
	}
}

function hover_control(event) {
	var target = Event.findElement(event, "DT");
	Element.addClassName(target, "dt_hover");
}

function unhover_control(event) {
	var target = Event.findElement(event, "DT");
	var classes = target.className.split(" ");
	target.className = "";
	for(var x = 0; x < classes.length; x++)
	{
		if(classes[x] == "dt_hover")
			continue;
		target.className += " " + classes[x] + " ";
	}
}

function toggle_background(event) {
	var target = Event.findElement(event, "li");
	if(event.type == "mouseover") {
		target.style.background = "#FFF8DC";
	}
	else {
		target.style.background = "";
	}
}


function edit_record(event) {
  var target = Event.element(event);
  var fid = target.id.split("_")[2];
}

function get_active_tab(event) {
  var target = Event.findElement(event, "li");
  var index = target.id.split("_");
  Element.removeClassName(
    document.getElementsBySelector(
      ".selected_tab_title")[0], "selected_tab_title");
  Element.removeClassName(
    document.getElementsBySelector(
      ".selected_tab_content")[0], "selected_tab_content");
  Element.addClassName(target, "selected_tab_title");
  Element.addClassName($("tab_content_" + index[2]), "selected_tab_content");
}




function trigger_info_bubble(event) {
	var target = Event.findElement(event, "TR");
	var subject = Event.findElement(event, "DIV");
	subject = subject.id;
	CZmarkers.openInfoWindow(target.rowIndex - 1, subject);
}

function adjust_size(event) {

	map.container.style.height = body.clientHeight - 50 + "px";
	map.container.style.width = body.clientWidth - 50 + "px";;
	map.onResize(event);
	//alert("New size: " + body.clientHeight + "(h) x " + body.clientWidth + "(w)" +
	//"container id: " + map.container.id + map.onResize.toString());
	Event.stop(event);
}

function hover_row(event) {
	var target = Event.findElement(event, "TR");
	Element.addClassName(target, "hover_row");

}

function unhover_row(event) {
	var target = Event.findElement(event, "TR");
	Element.removeClassName(target, "hover_row");
	Event.stop(event);

}




