//var stridemap;

function startOver() {
    stridemap.map.clearOverlays(); 
    stridemap.points = '';
    stridemap.markers = [];
    $('data-distance').getElementsByTagName('dt')[0].innerHTML = "";
    $('data-distance').getElementsByTagName('dd')[0].innerHTML = "";
    $('data-points').getElementsByTagName('dt')[0].innerHTML = "";
    $('data-points').getElementsByTagName('dd')[0].innerHTML = "";
    
    /*var lat = stridemap.map.getCenter().lat();
    var lng = stridemap.map.getCenter().lng();
    var zoom =stridemap.map.getZoom();
    GUnload();
    stridemap = new StrideMap($('map-body'), lat, lng, zoom, mapCallback);
    */
}

function StrideMap(map, callback, lat, lng, zoom) {
    if (callback) this.callback = callback;
		
		if (lat && lng) map.setCenter(new GLatLng(lat, lng));
		if (zoom) map.setZoom(zoom);

    this.markers = [];
    this.distance = 0;
    this.point_count = 0;
    this.enabled = true;

    this.map = map;
    this.route = new GPolyline();	
    this.timeout = 0;

    GEvent.bind(this.map, 'click', this, this.clickTimeout);
    GEvent.bind(this.map, "dblclick", this, this.dblClick);
}
StrideMap.prototype.load = function() {

}
StrideMap.prototype.disable = function() {
    this.enabled = false;
    for (var i = 0; i < this.markers.length; i++) {
        this.markers[i].disableDragging();
    }
}
StrideMap.prototype.refresh = function() {
    this.plotRoute();
    this.setDistance();  
    this.setPointCount();
    this.callback(this);
}

StrideMap.prototype.dblClick = function() {
    clearTimeout(this.timeout);
}


StrideMap.prototype.click = function() {
    clearTimeout(this.timeout);

		var marker = this.event_marker;
		var point = this.event_point;

    if (!this.enabled) return false;
    if (!marker) {
        marker = new StrideMarker(this, point, false); 
    }
}

StrideMap.prototype.clickTimeout = function(marker, point) {
    clearTimeout(this.timeout);
		obj = this;
		this.event_marker = marker;
		this.event_point = point;
    this.timeout = setTimeout("obj.click()", 250);
}

StrideMap.prototype.plotRoute = function() {
    if (this.route) this.map.removeOverlay(this.route);
    this.route = new GPolyline(this.getPoints(), "#FF0000", 3);
    this.map.addOverlay(this.route);             
}
StrideMap.prototype.getPoints = function() {
    var points = new Array();
    for (var i = 0; i < this.markers.length; i++) {
        points.push(this.markers[i].getPoint());
    }
    return points;  
}
StrideMap.prototype.getPointString = function() {
    var points = "";
    for (var i = 0; i < this.markers.length; i++) {
        points += this.markers[i].getPoint().lat() + "," + this.markers[i].getPoint().lng();
        if (i < (this.markers.length - 1)) points += ";";
    }
    return points;  
}
StrideMap.prototype.setDistance = function() {
    var distance = 0;
    for (var i = 1; i < this.markers.length; i++) {
        distance += this.markers[i].getPoint().distanceFrom(this.markers[i - 1].getPoint());
    }
    this.distance = distance;
}

StrideMap.prototype.setPointCount = function() {
    this.point_count = this.markers.length;
    
    if (this.point_count == 300)
    {
        alert('Warning: Adding more points can adversely affect browser performance for this map.');
    }
}


function StrideMarker(caller, point, endPoint) {
    this.caller = caller;    
    
    if (this.caller.markers.length == 0)
    {
        var icon = new MapIcon('green-start');
    }
    else if (endPoint == true)
    {
        var icon = new MapIcon('red-end-alt');        
    }   
    else
    {
        var icon = new MapIcon('red-end');   
    }

    this.gmarker = new GMarker(point, {icon: icon, draggable: true, bounceGravity: 0.5});
    GEvent.bind(this.gmarker, 'dragend', this, this.dragend);
    GEvent.bind(this.gmarker, 'click', this, this.click);
        
    this.caller.markers.push(this.gmarker);
    this.caller.map.addOverlay(this.gmarker);
    
    // Change previous point to gray
    if (this.caller.markers.length > 2)
    {
        var previousMarker = this.caller.markers[this.caller.markers.length-2];
        var previousPoint  = previousMarker.getPoint();                                      
        this.caller.map.removeOverlay(previousMarker);        
        
        var icon     = new MapIcon('gray');
        this.gmarker = new GMarker(previousPoint, {icon: icon, draggable: true, bounceGravity: 0.5});        
        GEvent.bind(this.gmarker, 'dragend', this, this.dragend);
        GEvent.bind(this.gmarker, 'click', this, this.click);
        
        this.caller.markers[this.caller.markers.length-2] = this.gmarker;
        this.caller.map.addOverlay(this.gmarker);
    }

    this.caller.refresh();
}

StrideMarker.prototype.dragend = function() {
    this.caller.refresh();
}

StrideMarker.prototype.click = function() {
    if (!this.caller.enabled) return false;
    if (this.gmarker == this.caller.markers[0]) {
        marker = new StrideMarker(this.caller, this.caller.markers[0].getPoint(), true);
        //this.gmarker.disableDragging();		
        this.caller.disable();
    }
}
