﻿var GMapHelper =
{
    DefaultLat: 0,
    DefaultLng: 0,
    DefaultZoom: 5,
    //DefaultIconDim: 16,

    coverage: false,
    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);
    }
}

GMapHelper.uninit = function() {
    if (GMapHelper.mapControl) {
        GUnload();
    }
}

GMapHelper.toggleCoverage = function() {
    GMapHelper.coverage = !GMapHelper.coverage;
    for (i in GMapHelper.markers) {
        GMapHelper.markers[i].toggleCoverage();
    }
}

GMapHelper.createCircle = function(center, color, radius) {
    if (radius == 0) return null;

    var bounds = new GLatLngBounds();
    var points = Array();
    var precision = 10;

    with (Math) {
        var d = radius / (6378.8); // radians

        var lat1 = (PI / 180) * center.lat(); // radians
        var lng1 = (PI / 180) * center.lng(); // radians
        for (var a = 0; a < (360 / precision) + 1; a++) {
            var tc = (PI / 180) * precision * a;
            var y = asin(sin(lat1) * cos(d) + cos(lat1) * sin(d) * cos(tc));
            var dlng = atan2(sin(tc) * sin(d) * cos(lat1), cos(d) - sin(lat1) * sin(y));
            var x = ((lng1 - dlng + PI) % (2 * PI)) - PI; // MOD function
            var point = new GLatLng(parseFloat(y * (180 / PI)), parseFloat(x * (180 / PI)));
            points.push(point);
            bounds.extend(point);
        }
        if (d < 1.5678565720686044) {
            circle = new GPolygon(points, color, 2, 1, color, 0.25);
        }
        else {
            circle = new GPolygon(points, color, 2, 1);
        }
        return circle;
    }
}

GMapHelper.createPolygon = function(points, color) {
	polygon = new GPolygon(points, color, 2, 1, color, 0.25);
	if (points.length != 0)
		points.push(points[0]);
    return polygon;
}

GMapHelper.createMarker = function(img, lat, lng) {
    var object = {
        name: null,
        group: null,
        popup: null,
        coverage: false,
        marker: null,
        
        figures: new Array()
    };

    var icon = new GIcon(G_DEFAULT_ICON);
    icon.iconSize = new GSize(20, 34);
    icon.iconAnchor = new GPoint(10, 32);
    icon.infoWindowAnchor = new GPoint(32, 0);

    icon.image = img;

    object.marker = new GMarker(new GLatLng(lat, lng), { icon: icon });
    GEvent.addListener(object.marker, "click", function(e) {
        object.doPopup();
    });

    GEvent.addListener(object.marker, "mouseover", function(e) {
        if (object.popup != null) {
            Tip(object.popup);
        }
    });

    GEvent.addListener(object.marker, "mouseout", function(e) {
        if (object.popup != null) {
            UnTip();
        }
    });

    object.visible = false;

	object.getLatLng = function() {
		return object.marker.getLatLng();
	}
	 
    object.show = function() {
        if (!object.visible) {
            object.visible = true;
            if (GMapHelper.coverage)
                object.showCoverage();

            GMapHelper.mapControl.addOverlay(object.marker);
        }
    }

    object.doPopup = function() {
        if (object.popup != null && object.marker != null)
            object.marker.openInfoWindowHtml(object.popup);
    }

    object.hide = function() {
        if (object.visible) {
            object.visible = false;
            object.hideCoverage();
            GMapHelper.mapControl.removeOverlay(object.marker);
        }
    }

    object.toggle = function() {
        if (object.visible)
            object.hide();
        else
            object.show();
    }

    object.showCoverage = function() {
        if (object.visible) {
            object.coverage = true;

			for (var i in object.figures)
				object.showFigure(object.figures[i]);			
        }
    }

    object.hideCoverage = function() {

        object.coverage = false;

        for (var i in object.figures)
				object.hideFigure(object.figures[i]);			
    }

    object.toggleCoverage = function() {
        if (object.coverage) {
            object.hideCoverage();
        }
        else {
            object.showCoverage();
        }
    }

    object.showFigure = function(figure) {
        if (figure != null)
            GMapHelper.mapControl.addOverlay(figure);

        return figure;
    }

    object.hideFigure = function(figure) {
        if (figure != null) {
            GMapHelper.mapControl.removeOverlay(figure);
        }

        return figure;
    }

    object.moveTo = function() {
        GMapHelper.mapControl.panTo(object.marker.getLatLng());
    }   

    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 in group.markers) {
            group.markers[i].show();
        }
    }

    group.hide = function() {
        group.visible = false;
        for (i in group.markers) {
            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 in GMapHelper.groups) {
        var group = GMapHelper.groups[i];
        if (group.name == name) {
            return group;
        }
    }
    return null;
}

GMapHelper.marker = function(name) {
    for (i in GMapHelper.markers) {
        var marker = GMapHelper.markers[i];
        if (marker.name == name) {
            return marker;
        }
    }
    return null;
}

GMapHelper.showMarkers = function(markers) {
    for (i in markers) {
        var marker = markers[i];
        marker.show();
    }
}

GMapHelper.showAllMarkers = function() {
    for (i in GMapHelper.markers) {
        var marker = GMapHelper.markers[i];
        marker.show();
    }
}

GMapHelper.showAllGroups = function() {
    for (i in GMapHelper.groups) {
        var group = GMapHelper.groups[i];
        group.show();
    }
}