var GMapHelper =
{
    DefaultLat: 0, 
    DefaultLng: 0,
    DefaultZoom: 5,
    DefaultIconDim: 28,
    allowAutoPopup: true,

    mapControl: null,
    groups: new Array(),
    markers: new Array()
}

GMapHelper.init = function(map, lat, lng, zoom) {
    if (GBrowserIsCompatible()) {
        this.mapControl = new GMap2(document.getElementById(map));
        GMapHelper.mapControl.setUIToDefault();
        GMapHelper.mapControl.setCenter(new GLatLng(lat, lng), zoom);        
           
        GEvent.addListener(GMapHelper.mapControl, "zoomend", function(oldLevel,  newLevel) {
			GMapHelper.redrawMarkers();
        });

        GEvent.addListener(GMapHelper.mapControl, "moveend", function() {
            GMapHelper.redrawMarkers();
        });
    }
}

GMapHelper.uninit = function() {
    if (GMapHelper.mapControl) {
        GUnload();
    }
}

GMapHelper.createLabel = function(title, point) {
	var object = {
		visible: false,
		div: null,
		title: null,
		point: null,
		created: false
	};
	
	object.title = title;	
	object.div = document.createElement("div");
	object.point= point;
	object.div.className = "mlabel";
	object.div.innerHTML = object.title;
	
        
	object.redraw = function() {	
		if (!object.created) {
			GMapHelper.mapControl.getPane(G_MAP_MARKER_PANE).appendChild(object.div);
			object.created = true;
		}
		
		var pdiv = GMapHelper.mapControl.fromLatLngToDivPixel(object.point);

		object.div.style.left = (pdiv.x - GMapHelper.DefaultIconDim / 2) + "px";
		object.div.style.top = (pdiv.y - GMapHelper.DefaultIconDim / 2) + "px";
		object.div.style.zIndex = 999;
		object.div.style.display = "block";
	}
	
	return object;
}

GMapHelper.redrawMarkers = function(){
	for (i=0; i<GMapHelper.markers.length; i++) {
		GMapHelper.markers[i].redrawLabel();            
    }
}

GMapHelper.createMarker = function(img, lat, lng) {
    var object = {
        name: null,
        group: null,
        popup: null,
        label: null,
        autoPopup: false
    };

    var icon = new GIcon(G_DEFAULT_ICON);
    icon.iconSize = new GSize(GMapHelper.DefaultIconDim, GMapHelper.DefaultIconDim);
    icon.image = img;
    icon.shadow = null;
    icon.iconAnchor = new GPoint(GMapHelper.DefaultIconDim / 2, GMapHelper.DefaultIconDim / 2);
    icon.shadowSize = new GSize(0, 0);
    icon.infoWindowAnchor = new GPoint(GMapHelper.DefaultIconDim, 0);
    
    var width = GMapHelper.DefaultIconDim;
	var height = GMapHelper.DefaultIconDim;	
    icon.imageMap = [0, 0, 0, height, width, height, width, 0];

    object.marker = new GMarker(new GLatLng(lat, lng), { icon: icon });
    GEvent.addListener(object.marker, "click", function(e) {
        object.showBalloon();
    });

    object.visible = false;

    object.show = function() {
        if (!object.visible) {
            object.visible = true;
            object.redrawLabel();
            
            GMapHelper.mapControl.addOverlay(object.marker);            
            if (GMapHelper.allowAutoPopup && object.autoPopup)
				object.showBalloon();
        }
    }

    object.hide = function() {
        if (object.visible) {
            object.visible = false;
            GMapHelper.mapControl.removeOverlay(object.marker);
        }
    }

    object.toggle = function() {
        if (object.visible)
            object.hide();
        else
            object.show();
    }
    
    object.panTo = function() {
        GMapHelper.mapControl.panTo(object.marker.getLatLng());
    }

    object.showBalloon = function() {
        if (object.popup != null) {
            object.marker.openInfoWindowHtml(object.popup, { noCloseOnClick : true });
        }

    }
    
    object.createLabel = function(title) {   
         object.label = GMapHelper.createLabel(title, object.marker.getLatLng());
    }
    
    object.redrawLabel = function() {	
        if (object.label != null) {
			object.label.redraw();   
        }        
    }

    GMapHelper.markers.push(object);
    return object;
}

GMapHelper.createGroup = function(groupName, groupImg) {
    var group = {
        name: groupName,
        markers: new Array(),
        image: groupImg,
        visible: false
    };

    group.createMarker = function(lat, lng) {
        var marker = GMapHelper.createMarker(group.image, lat, lng);
        marker.group = group;
        group.markers.push(marker);
        return marker;
    }

    group.show = function() {
        group.visible = true;
        for (i=0; i<group.markers.length; i++) {
            group.markers[i].show();
        }
    }

    group.hide = function() {
        group.visible = false;
        for (i=0; i<group.markers.length; i++) {
            group.markers[i].hide();
        }
    }

    group.toggle = function() {
        if (group.visible)
            group.hide();
        else
            group.show();
    }

    GMapHelper.groups.push(group);
    return group;
}

GMapHelper.group = function(name) {
    for (i=0; i<GMapHelper.groups.length; i++) {
        var group = GMapHelper.groups[i];
        if (group.name == name) {
            return group;
        }
    }
    return null;
}

GMapHelper.marker = function(name) {
    for (i=0; i<GMapHelper.markers.length; i++) {
        var marker = GMapHelper.markers[i];
        if (marker.name == name) {
            return marker;
        }
    }
    return null;
}

GMapHelper.showMarkers = function(markers) {
    for (i=0; i<markers.length; i++) {
        var marker = markers[i];
        marker.show();
    }
}

GMapHelper.showMarkerBalloons = function(markers) {
    for (i=0; i<markers.length; i++) {
        var marker = markers[i];
        marker.showBalloon();
    }
}

GMapHelper.showAllMarkers = function() {
    for (i=0; i<GMapHelper.markers.length; i++) {
        var marker = GMapHelper.markers[i];
        marker.show();
    }
}

GMapHelper.showAllGroups = function() {
    for (i=0; i<GMapHelper.groups.length; i++) {
        var group = GMapHelper.groups[i];
        group.show();
    }
}