from django import template
from django.conf import settings


register = template.Library()



class GoogleMapNode(template.Node):
    
    def __init__(self,postcode='',xandy='',zoom=14):
        self.postcode = template.Variable(postcode.strip("\""))
        self.x, self.y = xandy.strip('"').split('x')
        self.zoom = template.Variable(zoom)
        
    def render(self,context):
        error = []
        if not hasattr(settings, 'GOOGLE_MAPS_API_KEY'):
            error.append('Google maps api not found')
        if not hasattr(settings, 'GOOGLE_AJAX_API_KEY'):
            error.append('Google ajax key not found')
            
        postcode = self.postcode.resolve(context)
        try:
            zoom = int(self.zoom.resolve(context))
        except:
            error.append('Zoom must be an integer')
        answer = '<script src="http://maps.google.com/maps?file=api&v=2&key=%s"type="text/javascript"></script>' % settings.GOOGLE_MAPS_API_KEY
        answer += '<script src="http://www.google.com/uds/api?file=uds.js&v=1.0&key=%s" type="text/javascript"></script>' % settings.GOOGLE_AJAX_API_KEY
        answer += '<script>function get_postcode() { return "%s"; }</script>' % postcode
        answer += '<script>function get_zoom() { return %d; }</script>' % zoom
        answer += '<script src="%sjs/google_map_ukpostcodes.js" type="text/javascript"></script>' % settings.MEDIA_URL
        answer += '<div id="map" style="width: %spx; height: %spx; position: relative;"></div>' % (self.x,self.y)
        if error:
            return ', '.join(error)
        return answer
        
    
    
@register.tag
def googlemap_from_ukpostcode(parser,token):
    bits = token.contents.split()
    if len(bits) == 3:
        return GoogleMapNode(postcode=bits[1],xandy=bits[2])
    elif len(bits) == 4:
        return GoogleMapNode(postcode=bits[1],xandy=bits[2],zoom=bits[3])
    else:
        raise template.TemplateSyntaxError("'%s' tag takes two or three arguments, postcode, x/y size of map (e.g. \"100x200\") and zoom level" % bits[0])
    
    
=============

google_map_ukpostcodes.js


var map;
var localSearch = new GlocalSearch();

var icon = new GIcon();
icon.image = "http://www.google.com/mapfiles/marker.png";
icon.shadow = "http://www.google.com/mapfiles/shadow50.png";
icon.iconSize = new GSize(20, 34);
icon.shadowSize = new GSize(37, 34);
icon.iconAnchor = new GPoint(10, 34);


function usePointFromPostcode(postcode, callbacks) {
	localSearch.setSearchCompleteCallback(null, 
		function() {
			if (localSearch.results[0])
			{		
				var resultLat = localSearch.results[0].lat;
				var resultLng = localSearch.results[0].lng;
				var point = new GLatLng(resultLat,resultLng);
				for (var i=0;i<callbacks.length;i++) {
					callbacks[i](point)
					
				}
				return point;
			}else{
				alert("Postcode not found!");
			}
		});	
		
	localSearch.execute(postcode + ", UK");
}

function placeMarkerAtPoint(point)
{
	var marker = new GMarker(point,icon);
	map.addOverlay(marker);
}

function setCenterToPoint(point)
{
	map.setCenter(point, get_zoom());
}

function showPointLatLng(point)
{
	alert("Latitude: " + point.lat() + "\nLongitude: " + point.lng());
}

function mapLoad() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map"));
		
		pc = get_postcode();
		
		//map.addControl(new GLargeMapControl());
		//map.addControl(new GMapTypeControl());
		map.setCenter(new GLatLng(54.622978,-2.592773), get_zoom(), G_HYBRID_MAP);
		usePointFromPostcode(pc,Array(placeMarkerAtPoint,setCenterToPoint));
	}
}


function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
    }
  }
}

function addUnLoadEvent(func) {
	var oldonunload = window.onunload;
	if (typeof window.onunload != 'function') {
	  window.onunload = func;
	} else {
	  window.onunload = function() {
	    oldonunload();
	    func();
	  }
	}
}

addLoadEvent(mapLoad);
addUnLoadEvent(GUnload);


