var mouseX;
var mouseY;

var map;
var route = new Array;
var routeLine = null;
var nextLine   = null;
var nextMarker = null;

var title = '';
var description = '';
var stars = 0;

var mileMarker = new Array;
var startMarker = null;
var endMarker = null;

var isEditable = true;

function StartYMap()
	{
	map = new YMap(document.getElementById('ymap'),YAHOO_MAP_REG);
	
	
	var cPT = new YGeoPoint(37.4041960114344,-122.008194923401);
	/*
	map._rundoubleClick = function (_e) {
										YEvent.stopEvent(_e);
										if (this._disableDrag) { return; }
										var _ll = this._getEvGP(_e);
										var _ce = new _eO(this, this.YGeoPoint, {previous:this.zoomLevelPrev, current:this.zoomLevel});
										this.Events.MouseDoubleClick.trigger(_ce, _ll);
										}
	*/
	try{map.disablePanOnDoubleClick();}
	catch(err){/*alert("no good");*/}
	
	map.drawZoomAndCenter(cPT,3);
	map.addTypeControl();
	
	var zp = new YCoordPoint(5,30);
	zp.translate('right','bottom');
	map.addZoomLong(zp);
	
	var pp = new YCoordPoint(2,5);
	pp.translate('right','top');
	map.addPanControl(pp);
	
	YEvent.Capture(map,EventsList.MouseDoubleClick,clickFunction);
	YEvent.Capture(map,EventsList.polylineAdded,routeChanged);
	YEvent.Capture(map,EventsList.polylineRemoved,routeChanged);
	document.getElementById('ymap').addEventListener("mousemove", mouseTracker, true);
	
	isEditable = true;
	
	if(id)
		{
		loadRoute();
		}
	}

function clickFunction(event)
	{
	addLocationToMap(map.convertXYLatLon(new YCoordPoint(mouseX, mouseY)));
	}


function addLocationToMap(geoPoint)
	{
	if(!isEditable)
		return;
	
	map.removeOverlay(routeLine);
	addLocationToRoute(geoPoint);
	routeLine = new YPolyline(route,'blue',7,0.7);
	map.addOverlay(routeLine);
	}

function addLocationToRoute(geoPoint)
	{
	if(route.length > 0)
		{
		var startDistance = routeDistance();
		route.push(geoPoint);
		var endDistance = routeDistance();
		
		if(Math.floor(endDistance) > Math.floor(startDistance))
			{
			for(var i = Math.floor(endDistance); i > Math.floor(startDistance); i--)
				{
				var ratio = (endDistance - Math.floor(endDistance) + (Math.floor(endDistance) - i))/(endDistance - startDistance);
				
				var newPoint  = new YGeoPoint(route[route.length-2].Lat*ratio + route[route.length-1].Lat*(1-ratio),
											  route[route.length-2].Lon*ratio + route[route.length-1].Lon*(1-ratio));
				
				mileMarker[i] = new YMarker(newPoint, new YImage("marker"+(i>30?"":i)+".png", new YSize(30,33)));
				map.addOverlay(mileMarker[i]);
				}
			}
		}
	else
		{
		route.push(geoPoint);
		startMarker = new YMarker(geoPoint, new YImage("start.png", new YSize(30,33)));
		map.addOverlay(startMarker);
		}
	}

function removeLocationFromRoute()
	{
	if(isEditable)
		{
		map.removeOverlay(nextLine);
		map.removeOverlay(nextMarker);
		
		if(route.length > 1)
			{
			var startDistance = routeDistance();
			map.removeOverlay(routeLine);
				route.pop();
				routeLine = new YPolyline(route,'blue',7,0.7);
			map.addOverlay(routeLine);
			var endDistance =  routeDistance();
			
			if(endMarker)
				{
				map.removeOverlay(endMarker);
				endMarker = null;
				}
			
			if(Math.floor(endDistance) < Math.floor(startDistance))
				{
				for(var i = Math.floor(startDistance); i > Math.floor(endDistance); i--)
					{
					map.removeOverlay(mileMarker[i]);
					}
				}
			}
		else
			{
			route.pop();
			map.removeOverlay(startMarker);
			}
		}
	}

function removeRoute()
	{
	if(isEditable)
		{
		route = new Array;
		map.removeMarkersAll();
		map.removeOverlay(nextLine);
		map.removeOverlay(routeLine);
		}
	}

function mouseTracker(event)
	{
	if((typeof route == 'undefined') || (typeof document.getElementById('ymap') == 'undefined'))
		return;
	
	mouseX = event.pageX-document.getElementById('ymap').offsetLeft - 10;
	mouseY = event.pageY-document.getElementById('ymap').offsetTop  - 10;
		
	if(route.length > 0)
		{
		var newPoint = new YCoordPoint(mouseX, mouseY);
		var oldPoint = map.convertLatLonXY(route[route.length-1]);
		
		if(1 ||newPoint.distance(oldPoint) > 16)
			{
			map.removeOverlay(nextLine);
			map.removeOverlay(nextMarker);
			
			if(event.shiftKey && isEditable)
				{
				var newGeoPoint = map.convertXYLatLon(newPoint)
				var color = map.getCurrentMapType() == YAHOO_MAP_REG ? "#000" : "#FFF";
				
				nextLine = new YPolyline([route[route.length-1], newGeoPoint],'blue',7,0.5);
				map.addOverlay(nextLine);
				
				nextMarker = new YMarker(newGeoPoint, new YImage("blank.png", new YSize(50, 20)));
				nextMarker.addLabel("<font style='color:"+color+";opacity: .8;'>"+((routeDistance()+route[route.length-1].distance(newGeoPoint).miles).toPrecision(3))+"</font>");
				map.addOverlay(nextMarker);
				}
			else
				{
				nextLine = null;
				nextMarker = null;
				}
			}
		}
	}

function routeDistance()
	{
	var distance = 0;
	
	if(route.length < 2)
		return 0;
	
	for(var i=1; i < route.length; i++)
		{
		distance += route[i-1].distance(route[i]).miles;
		}
	return distance;
	}

function zoomToLocale()
	{
	map.drawZoomAndCenter(document.getElementById('addressField').value, 4);
	}

function completeRoute()
	{
	if(route.length > 1)
		{
		if(endMarker)
			map.removeOverlay(endMarker);
		
		endMarker = new YMarker(route[route.length-1], new YImage("stop.png", new YSize(30,33)));
		map.addOverlay(endMarker);
		isEditable = false;
		}
	}

function uncompleteRoute()
	{
	if(endMarker)
		map.removeOverlay(endMarker);
	isEditable = true;
	}

function archiveRoute()
	{
	var points = new Array;
	
	for(var i=0; i < route.length; i++)
		{
		points.push(route[i].Lat + "," + route[i].Lon);
		}
	return(points.join(";"));
	}

function routeChanged()
	{
	document.getElementById('routeDistance').innerHTML = routeDistance().toPrecision(3);
	}

function showSaveRoute()
	{
	if(document.getElementById('bigBox').style.display == "none")
		{
		document.getElementById('tabBox').style.backgroundColor = "#E5E5E8";
		document.getElementById('tabBoxText').style.color = "#000";
		document.getElementById('tabBoxText').style.textDecoration = "none";
		document.getElementById('bigBox').style.display = "block";
		
		completeRoute();
		}
	else	//undo the damage
		{
		document.getElementById('tabBox').style.backgroundColor = "";
		document.getElementById('tabBoxText').style.color = "";
		document.getElementById('tabBoxText').style.textDecoration = "";
		document.getElementById('bigBox').style.display = "none";
		
		if(!id)
			uncompleteRoute();
		}
	}


function rating(s)
	{
	var i = 1;
	stars = s;
	
	for(i; i <= s; i++)
		{
		document.getElementById('star'+i).src = "bstar.png";
		document.getElementById('istar'+i).src = "bstar.png";
		}
	for(i; i <= 5; i++)
		{
		document.getElementById('star'+i).src = "gstar.png";
		document.getElementById('istar'+i).src = "gstar.png";
		}
	}

function responseHash(response)
	{
	var hash = new Object();
	var fields = response.split('&');
	
	for(var i = 0; i < fields.length; i++)
		{
		var token = fields[i].split('=');
		hash[token[0]] = token[1];
		}
	return hash;
	}


function loadRoute()
	{
	var routeInfo = queryRoute(id);
	
	if(routeInfo)
		{
		route = new Array;
		mileMarker = new Array;
		startMarker = null;
		endMarker = null;
		
		var points = routeInfo['pointset'].split(';');
		for(var i = 0; i < points.length; i++)
			{
			var point = points[i].split(',');
			addLocationToRoute(new YGeoPoint(parseFloat(point[0]),parseFloat(point[1])));
			}
		var point = points[0].split(',');
		
		routeLine = new YPolyline(route,'blue',7,0.7);
		map.addOverlay(routeLine);
		completeRoute();
		
		routeChanged();
		
		var optimal = map.getBestZoomAndCenter(route);
		map.drawZoomAndCenter(optimal['YGeoPoint'],optimal['zoomLevel']);
		
		title = routeInfo['title'];
		description = routeInfo['description'];
		stars = routeInfo['rating'];
		isEditable = false;
		
		updateDisplay();
		}
	}

function updateDisplay()
	{
	if(id)
		{
		document.getElementById('saveWarning').innerHTML = "";
		document.getElementById('tabBoxText').innerHTML = "info";
		document.getElementById('saveBox').style.display = "none";
		document.getElementById('infoBox').style.display = "block";
		document.getElementById('newBox').style.display = "block";
		document.getElementById('rmallBox').style.display = "none";
		document.getElementById('rmBox').style.visibility = "hidden";
		
		
		document.getElementById('infoRouteTitle').innerHTML = title;
		document.getElementById('infoRouteDescription').innerHTML = description;
		document.getElementById('permalink').href = "http://runner.oofn.net/?id="+id;
		
		rating(stars);
		isEditable = false;
		}
	else
		{
		document.getElementById('saveWarning').innerHTML = "";
		document.getElementById('tabBoxText').innerHTML = "save";
		document.getElementById('saveBox').style.display = "block";
		document.getElementById('infoBox').style.display = "none";
		isEditable = true;
		}
	}

function delicious()
	{
	location.href='http://del.icio.us/post?v=4;url='+encodeURIComponent("http://runner.oofn.net/?id="+id)+';title='+encodeURIComponent(title)+';notes='+encodeURIComponent(description);
	}

function mailLink()
	{
	if(id)
		{
		window.open('http://runner.oofn.net/mail.php?id='+id,'popup','width=500,height=300,scrollbars=no,resizable=no,toolbar=no,directories=no,menubar=no,status=no');
		}
	}

window.onload = StartYMap;
