  
var map = null;
var locs = [];
var markers = [];
var searchMarker = null;
var defaultBounds = null;

function encodeHtml(str)
{
    if(str)
    {
        return str.replace(/"/g,"&quot;")
        .replace(/</g,"&lt;")
        .replace(/>/g,"&gt;")
        .replace(/&/g,"&amp;")       
        .replace(/\n/g, "<br/>") 
    }
    else
    {
        return '';
    }
}

function infoWindowHtml(i)
{
    var loc = tourLocations[i];
   	var html = '<div class="mapTitle">'+loc.town+'</div>';
	for(var i = 0; i < loc.stops.length; i++)
	{
		var stop = loc.stops[i];
		html += '<div class="mapSingleStop">';
		if('hours' in stop)
		{
			html += '<div class="mapDate">'+stop.hours+'</div>';			
		}
		
		if('site' in stop)
		{
			html += '<div class="mapWhere">'+stop.site+'</div>';
		}
		
		if('directions' in stop)
		{
	   		html += '<div class="mapAddress">' + stop.directions + '</div>';			
		}
		
		if('reminder_url' in stop)
		{
	   	    html += '<div class="mapLink"><a href="'+stop.reminder_url+'">'+remindMeText+'</a></div>';			
		}

       	
		html += '</div>';
	}
   	return html;
}


function partial(fn)
{
    var args = []
    for(var i = 1; i < arguments.length; i++)
    {
        args.push(arguments[i]);
    }
    return function() {
        var fullArgs = new Array(args);
        for(var i = 0; i < arguments.length; i++)
        {
            fullArgs.push(arguments[i]);
        }
        fn.apply(null, fullArgs);  
    };
}

function tourInit() {
    if (GBrowserIsCompatible()) {
        $(document).unload(GUnload);
        
        map = new GMap2(document.getElementById("mapCanvas"));
        
        map.setCenter(new GLatLng(47.135555,-60.61084), 5);
        map.addControl(new GSmallMapControl());
        
        defaultBounds = map.getBounds();

        var icon = new GIcon(G_DEFAULT_ICON);
        icon.image = iconBaseUrl + 'marker.png';
        icon.printImage = iconBaseUrl + 'markerie.png';

    	for(var i = 0; i < tourLocations.length; i++)
    	{
    	    var latLng = new GLatLng(tourLocations[i].lat, tourLocations[i]['long']);
    	    locs[i] = latLng;

    		var marker = new GMarker(latLng, {icon:icon});
    		markers[i] = marker;

    		marker.bindInfoWindowHtml(infoWindowHtml(i))
    		map.addOverlay(marker);
    	}

		var line_points = []
		for(var i = 0; i < coordsOrdered.length; i++)
		{
			var latLng = new GLatLng(coordsOrdered[i].lat, coordsOrdered[i]['long']);
    	    line_points[i] = latLng;
		}
		
    	var line = new GPolyline(line_points, "#FF7799", 5, 1);
//    	if(!isIe6())
	    {
    	    map.addOverlay(line)	        
	    }
    	
	}
}

function isIe6()
{
    var version = jQuery.browser.version;
    var result = jQuery.browser.msie && version && version < 7;
    return result;
}

function zoomTo(where)
{
    if(where)
    {
        if(!searchMarker)
        {
            var icon = new GIcon(G_DEFAULT_ICON);
            icon.image = iconBaseUrl + 'marker-blue.png';
            icon.printImage = iconBaseUrl + 'markerie-blue.png';
            searchMarker = new GMarker(where, {icon: icon, title: "You are here", bouncy: true});
            map.addOverlay(searchMarker);
        }
        else
        {
            searchMarker.setLatLng(where);
        }

        // find closest
        var closestIndex = 0;
        var closestDist = locs[0].distanceFrom(where);
        for(var i = 1; i < locs.length; i++)
        {
            var dist = locs[i].distanceFrom(where);
            if(dist < closestDist)
            {
                closestDist = dist;
                closestIndex = i;
            }
        }
        
        var bounds = new GLatLngBounds();
        bounds.extend(where);
        bounds.extend(locs[closestIndex]);
        
        map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds) - 1);
        markers[closestIndex].openInfoWindow(infoWindowHtml(closestIndex));
    }
    else
    {
        showError()
    }
}

function showError()
{
    $('#postalError').html()
    $('#postalError').show("normal", function(){})
}

function hideError()
{
    $('#postalError').hide("normal", function(){})
}

function getCoder()
{
    var coder = new GClientGeocoder();
    coder.setBaseCountryCode("ca");
    coder.setViewport(defaultBounds);
    return coder;
}

function searchPostal()
{
    hideError();
    getCoder().getLatLng($('#searchAddress').val() + " Canada", zoomTo);
    return false;
}