var the_map = 0;
var user_circle = 0;
var info_string = "fuzzy wuzzy was a bear";
var ctr = 0;

function emm(phi)
{
    // north-south radius of curvature M for latitude of phi degrees
    // (in kilometers)
    // going to do this the lazy way and just linearly interpolate
    // the wikipedia data...
    var knots = [6335.44, 6339.70, 6351.38, 6367.38, 6383.45,
		 6395.26, 6399.59];
    phi = Math.abs(phi);
    var low = Math.floor(phi/15);
    var lam = (phi - low*15)/15;
    return (1-lam)*knots[low] + lam*knots[low+1];
}

function enn(phi)
{
    // east-west radius of curvature N, as above
    var knots = [6378.14, 6379.57, 6383.48, 6388.84, 6394.21,
		 6398.15, 6399.59];
    phi = Math.abs(phi);
    var low = Math.floor(phi/15);
    var lam = (phi - low*15)/15;
    return (1-lam)*knots[low] + lam*knots[low+1];
}

function km_2_degrees_lat(km, clat)
{
    // how many degrees of latitude do I need to move 'km' kilometers
    // starting from a latitude of 'clat'?
    return (180.0*km)/(Math.PI*emm(clat))
}

function km_2_degrees_lon(km, clat)
{
    // how many degrees of longitude do I need to move 'km' kilometers
    // starting from a latitude of 'clat'? 
    // yes, this will wig out if you try it at the poles, so don't
    // do that.
    return (180.0*km)/(Math.PI*enn(clat)*Math.cos(clat))    
}

function area_2_radius(area)
{
    // finds the radius of a circle with area 'area'
    return Math.sqrt(area/Math.PI)
}

function circle_points(clat, clon, r, n)
{
    // r is now in kilometers, which means (if I implement this right)
    // that we should roughly get a geological circle
    var points = new Array(n+1);
    rx = km_2_degrees_lon(r, clat);
    ry = km_2_degrees_lat(r, clat);
    for(i=0; i < n; i++)
	{
	    points[i] = new GLatLng(clat + ry*Math.cos(2* Math.PI/n * i),
				    clon + rx*Math.sin(2* Math.PI/n * i));
	}
    points[n] =  new GLatLng(clat + ry*Math.cos(0),
			     clon + rx*Math.sin(0));
    return points;
}

function remove_circle()
{
    if(user_circle)
	{
	    the_map.removeOverlay(user_circle);
	}
}

function draw_circle(clat, clon, rad)
{
    // var area_output = document.getElementById("area_output");
    user_circle = new GPolygon(circle_points(clat,clon, rad, 15),
			       "#ff0000", 2, .7,
			       "#ff0000", .3);
    // area_output.value = user_circle.getArea() / (1000000);
    the_map.addOverlay(user_circle);
}

function parse_pop()
{
    inpute = document.getElementById("pop_input").value;
    return parseFloat(inpute); // fractional people?? why not
}

function parsify(prefix,pop)
{
    var name,inpute,consum,effic;
    name = prefix+"_input";
    inpute = document.getElementById(name).value;
    consum = parseFloat(inpute) * (365.2422/1000.0) * pop; /* convert from g/day to kg/year */
    if(isNaN(consum))
	{
	    alert("Please enter a numerical value for " + prefix + " consumption.");
	    return [0];
	}
    name = prefix+"_e_input";
    inpute = document.getElementById(name).value;
    effic = parseFloat(inpute);
    if(isNaN(effic))
	{
	    alert("Please enter a numerical value for " + prefix + " efficiency.");
	    return [0];
	}
    return [consum, effic, consum/effic];
}

function meat_contrib(prefix, corn_effic,pop)
{
    var name,inpute,consum,fcr,effic,pasture,feed;
    name = prefix+"_input";
    inpute = document.getElementById(name).value;
    consum = parseFloat(inpute) * (365.2422/1000.0) * pop; /* convert from g/day to kg/year */
    if(isNaN(consum))
	{
	    alert("Please enter a numerical value for " + prefix + " consumption.");
	    return [0];
	}
    name = prefix+"_fcr_input";
    inpute = document.getElementById(name).value;
    fcr = parseFloat(inpute);
    if(isNaN(fcr))
	{
	    alert("Please enter a numerical value for " + prefix + " FCR.");
	    return [0];
	}
    name = prefix+"_e_input";
    inpute = document.getElementById(name).value;
    effic = parseFloat(inpute);
    if(isNaN(effic))
	{
	    alert("Please enter a numerical value for " + prefix + " pasture efficiency.");
	    return [0];
	}
    feed = fcr*consum/corn_effic;
    pasture = consum/effic;
    return [feed+pasture,feed,pasture];
}

function compute_areas()
{
    // grab the user's input and find the total area consumed
    var total = 0;
    var corn_numbers, corn_effic, beef_numbers, chicken_numbers;
    
    pop = parse_pop();

    corn_numbers = parsify("corn",pop);
    if(corn_numbers.length < 3)
	{
	    return [0];
	}
    total += corn_numbers[2];
    corn_effic = corn_numbers[1];

    chicken_numbers = meat_contrib("chicken", corn_effic, pop);
    if(chicken_numbers.length < 3)
	return [0];
    total += chicken_numbers[0];

    beef_numbers = meat_contrib("beef", corn_effic, pop);
    if(beef_numbers.length < 3)
	return [0];
    total += beef_numbers[0];

    return [total,corn_numbers,chicken_numbers, beef_numbers];
}

function pop_info()
{
    the_map.openInfoWindowHtml(ctr, info_string);			       
}

function make_marker(clat, clng)
{
    var marker = new GMarker(ctr);
    GEvent.addListener(marker, "click", pop_info);
    the_map.addOverlay(marker);
}

function initialize()
{
    if (GBrowserIsCompatible())
	{
	    the_map = new GMap2(document.getElementById("map_canvas"));
	    ctr = new GLatLng(43.216186,-77.585449);
	    the_map.setCenter(ctr, 6);
	    the_map.setUIToDefault();
	    the_map.setMapType(G_SATELLITE_MAP);
	    make_marker();
	    adjust_circle();
	}
}

//     var area_input = document.getElementById("area_input");
//     var area = parseFloat(area_input.value);
//     var clat = 43.216186;
//     var clon = -77.585449;

function make_info(clat,clon,areas)
{
    sumtd = '<td style="border-bottom-style: solid; border-width: thin; border-color: black;">';
    info_string = '<table style="border-collapse:collapse">' +
	'<tr><td></td><td>' + areas[1][2] + '</td>' +
	'<td>km<sup>2</sup> food corn</td></tr>' +
	'<tr><td>+</td><td>' + areas[2][0] + '</td>' +
	'<td>km<sup>2</sup> chicken pasture</td></tr>' +
	'<tr><td>+</td><td>' + areas[2][1] + '</td>' +
	'<td>km<sup>2</sup> chicken feed</td></tr>' +
	'<tr><td>+</td><td>' + areas[3][0] + '</td>' +
	'<td>km<sup>2</sup> cow pasture</td></tr>' +
	'<tr>'+sumtd+'+</td>'+ sumtd + areas[3][1] + '</td>' +
	sumtd + 'km<sup>2</sup> cow feed</td></tr>' +
	'<tr><td></td><td>' + areas[0] + '</td>' +
	'<td>km<sup>2</sup> total</td></tr></table>';

    the_map.openInfoWindowHtml(new GLatLng(clat, clon),
			       info_string);			       
}

function adjust_circle()
{
    var clat = 43.216186;
    var clon = -77.585449;
    var areas;
    areas = compute_areas();
    if(areas.length >= 4)
	{
	    var rad = area_2_radius(areas[0]);
	    remove_circle();
	    //the_map.clearOverlays();
	    draw_circle(clat, clon, rad);
	    make_info(clat,clon,areas);
	}
}

function show_tab(id)
{
    var t;
    var el;
    var tabids = ["diet", "params"];
    //var tabs = document.getElementsByName("bat");
    var prefix;
    var bat;
    var headname;
    var head;

    el = tabids.length;
    for(t=0; t < el; t++)
	{
	    prefix = tabids[t];
	    headname = prefix + "-head";
	    bat = document.getElementById(prefix);
	    head = document.getElementById(headname);
	    if(bat.id == id)
		{
		    bat.style.cssText = "display:block";
		    head.className = "live_tab";
		}
	    else
		{
		    bat.style.cssText = "display:none";
		    head.className = "dead_tab";
		}
	}
}