var gmGeocoder = null;
var gmLoaded = 0;
var gmQueue = [];

function gmDo(callback) {
    if (gmLoaded == 0) {
        var script = document.createElement("script");
        script.type = "text/javascript";
        script.src = "http://maps.googleapis.com/maps/api/js?sensor=false&callback=gmInit";
        document.body.appendChild(script);
        gmLoaded = 1;
    }

    if(callback) {
        if(gmLoaded == 1) {
            gmQueue.push(callback);
        } else {
            callback();
        }
    }
}

function gmInit() {
    gmLoaded = 2;
    $.each(gmQueue, function(i, c) {
        c();
    });
    gmQueue = [];
}

function gmGeocoderInit() {
    if(gmGeocoder == null) {
        gmGeocoder = new google.maps.Geocoder();
    }
    return gmGeocoder;
}

function gmAddress(canvas, address) {
    map = new google.maps.Map(document.getElementById(canvas), {
        disableDefaultUI: true,
        draggable: false,
        zoom: 12,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    google.maps.event.addListener(map, 'click', function() {
        $('#'+canvas).next('a').click();
    });

    gmAddMarkers(map, address);
}

function gmLargeAddress(canvas, address) {
    map = new google.maps.Map(document.getElementById(canvas), {
        zoom: 12,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    gmAddMarkers(map, address);
}

function gmAddMarkers(map, address) {
    gmGeocoderInit();
    $.each(address.split(';'), function(i, a) {
        gmGeocoder.geocode( { 'address': a}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                map.setCenter(results[0].geometry.location);
                var marker = new google.maps.Marker({
                    map: map,
                    animation: google.maps.Animation.DROP,
                    position: results[0].geometry.location,
                    title: a
                });
            }
        });
    });
}
