function docGet(name){
    return document.getElementById(name);
}

reimers.map = {

    "initLoader": function(url) {
        var script = document.createElement("script");
        script.src = url;
        script.type = "text/javascript";
        document.getElementsByTagName("head")[0].appendChild(script);
    },

    "getItem": function(ID, List) { return reimers.map.GetItem(ID, List); },

    "GetItem": function(ID, List) {
        for (var i = 0; i < List.length; i++) {
            if (List[i].ID == ID) return List[i];
        }
        return null;
    },

    "removeItem": function(ID, List) { return reimers.map.RemoveItem(ID, List); },

    "RemoveItem": function(ID, List) {
        for (var i = 0; i < List.length; i++) {
            if (List[i].ID == ID) {
                GEvent.clearInstanceListeners(List[i]);
                List.splice(i, 1);
                return null;
            }
        }
        return null;
    },

    "clearAllOverlays": function(Map, List) {
        for (var i = 0; i < List.length; i++) {
            GEvent.clearInstanceListeners(List[i]);
        }
        Map.clearOverlays();
        List = new Array();
    },

    "plotPlacemarks": function(Placemarks, Map) {
        Map.clearOverlays();
        for (var i = 0; i < Placemarks.length; i++) {
            var place = Placemarks[i];
            var newMarker = new GMarker(new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]));
            Map.addOverlay(newMarker);
        }
    },

    "getServerData": function(result, context) {
        if (result == 1) {
            alert('Error in data exchange');
            window.status = 'Error in data exchange'
        } else {
            reimers.map.showLoading(false);
            try {
                eval(result);
            }
            catch (err) { }
        }
    },

    "onError": function(result, context) {
        alert(result);
    },

    "showLoading": function(show) {
        if (boolShowLoading) {
            if (show) { docGet("ctrlLoad").style.display = ''; }
            if (!show) { docGet("ctrlLoad").style.display = 'none'; }
        }
        else { docGet("ctrlLoad").style.display = 'none'; }
    },

    "WmsUrl": function(a, b, c) {
        var lULP = new GPoint(a.x * 256, (a.y + 1) * 256);
        var lLRP = new GPoint((a.x + 1) * 256, a.y * 256);

        var lUL = G_NORMAL_MAP.getProjection().fromPixelToLatLng(lULP, b, c);
        var lLR = G_NORMAL_MAP.getProjection().fromPixelToLatLng(lLRP, b, c);

        var lBbox = lUL.lng() + "," + lUL.lat() + "," + lLR.lng() + "," + lLR.lat();
        var lURL = this.baseUrls[0];
        lURL += "REQUEST=GetMap&SERVICE=WMS";
        lURL += "&VERSION=" + this.version;
        lURL += "&BBOX=" + lBbox;
        lURL += "&LAYERS=" + this.layers;
        lURL += "&STYLES=" + this.styles;
        lURL += "&FORMAT=" + this.format;
        lURL += "&BGCOLOR=0xFFFFFF&TRANSPARENT=TRUE&SRS=EPSG:4326&WIDTH=256&HEIGHT=256";
        return lURL;
    },

    "json": {

        "convertToGMarker": function(map, marker) {
            var jOpts = new Object();
            jOpts.id = marker.ID;
            jOpts.description = marker.Options.Description;
            jOpts.name = marker.Options.Name;
            jOpts.dragCrossMove = marker.Options.DragCrossMove;
            jOpts.title = marker.Options.Title;
            jOpts.clickable = marker.Options.Clickable;
            if (marker.Options.Icon) jOpts.icon = reimers.map.getItem(marker.Options.Icon.IconMapID, map.Icons);
            jOpts.draggable = marker.Options.Draggable;
            jOpts.bouncy = marker.Options.Bouncy;
            jOpts.bounceGravity = marker.Options.BounceGravity;
            jOpts.bounceTimeout = marker.Options.BounceTimeOut;
            var jMarker = new GMarker(this.convertToGLatLng(marker.Point), jOpts);
            if (marker.ClientsideHandlers.OnDragStart) { GEvent.addListener(jMarker, "dragstart", function() { eval(marker.ClientsideHandlers.OnDragStart); }); }
            if (marker.ClientsideHandlers.OnClick) { GEvent.addListener(jMarker, "click", function() { eval(marker.ClientsideHandlers.OnClick); }); }
            if (marker.ClientsideHandlers.OnDoubleClick) { GEvent.addListener(jMarker, "dblclick", function() { eval(marker.ClientsideHandlers.OnDoubleClick); }); }
            if (marker.ClientsideHandlers.OnDrag) { GEvent.addListener(jMarker, "drag", function() { eval(marker.ClientsideHandlers.OnDrag); }); }
            if (marker.ClientsideHandlers.OnDragEnd) { GEvent.addListener(jMarker, "dragend", function() { eval(marker.ClientsideHandlers.OnDragEnd); }); }
            if (marker.ClientsideHandlers.OnMouseOver) { GEvent.addListener(jMarker, "mouseover", function() { eval(marker.ClientsideHandlers.OnMouseOver); }); }
            if (marker.ClientsideHandlers.OnMouseOut) { GEvent.addListener(jMarker, "mouseout", function() { eval(marker.ClientsideHandlers.OnMouseOut); }); }
            if (marker.ClientsideHandlers.OnMouseUp) { GEvent.addListener(jMarker, "mouseup", function() { eval(marker.ClientsideHandlers.OnMouseUp); }); }
            if (marker.ClientsideHandlers.OnMouseDown) { GEvent.addListener(jMarker, "mousedown", function() { eval(marker.ClientsideHandlers.OnMouseDown); }); }
            if (marker.ClientsideHandlers.OnRemove) { GEvent.addListener(jMarker, "remove", function() { eval(marker.ClientsideHandlers.OnRemove); }); }
            if (marker.ClientsideHandlers.OnInfoWindowOpen) { GEvent.addListener(jMarker, "infowindowopen", function() { eval(marker.ClientsideHandlers.OnInfoWindowOpen); }); }
            if (marker.ClientsideHandlers.OnInfoWindowClose) { GEvent.addListener(jMarker, "infowindowclose", function() { eval(marker.ClientsideHandlers.OnInfoWindowClose); }); }
            jMarker.ID = marker.ID;
            return jMarker;
        },

        "convertToJsonMarker": function(marker, text) {
            var mrk = { "ID": marker.ID, "Latitude": marker.getPoint().lat(), "Longitude": marker.getPoint().lng() };
            if (text) { mrk.MarkerText = text; }
            return mrk;
        },

        "convertToJsonPolyline": function(line, color, width) {
            var ln = { "ID": line.ID, "Color": color, "Width": width };
            ln.Points = [];
            for (var i = 0; i < line.getVertexCount(); i++) {
                ln.Points.push(reimers.map.json.convertToJsonLatLng(line.getVertex(i)));
            }
            return ln;
        },

        "convertToJsonPolygon": function(shape, borderColor, borderWidth, borderOpacity, fillColor, fillOpacity) {
            var pg = { "ID": shape.ID, "BorderWidth": borderWidth, "FillOpacity": fillOpacity, "BorderColor": borderColor, "FillColor": fillColor };
            pg.Points = [];
            for (var i = 0; i < shape.getVertexCount(); i++) {
                pg.Points.push(reimers.map.json.convertToJsonLatLng(shape.getVertex(i)));
            }
            return pg;
        },

        "convertToGPolyline": function(line) {
            var jOpts = { "id": line.ID }
            var points = [];
            for (var i = 0; i < line.Points.length; i++) {
                points.push(new reimers.map.json.convertToGLatLng(line.Points[i]));
            }

            var jLine = new GPolyline(points, line.Color, line.Width, line.Opacity, jOpts);
            if (line.ClientsideHandlers.OnClick) { GEvent.addListener(jLine, "click", function(point) { eval(line.ClientsideHandlers.OnClick); }); }
            if (line.ClientsideHandlers.OnVisibilityChanged) { GEvent.addListener(jLine, "visibilitychanged", function(visible) { eval(line.ClientsideHandlers.OnVisibilityChanged); }); }
            if (line.ClientsideHandlers.OnLineUpdated) { GEvent.addListener(jLine, "lineupdated", function() { eval(line.ClientsideHandlers.OnLineUpdated); }); }
            jLine.ID = line.ID;
            return jLine;
        },

        "convertToGPolygon": function(shape) {
            var jOpts = { "id": shape.ID }
            var points = [];
            for (var i = 0; i < shape.Points.length; i++) {
                points.push(new reimers.map.json.convertToGLatLng(shape.Points[i]));
            }
            var jShape = new GPolygon(points, shape.BorderColor, shape.BorderWidth, shape.BorderOpacity, shape.FillColor, shape.FillOpacity, jOpts);
            if (shape.ClientsideHandlers.OnClick) { GEvent.addListener(jShape, "click", function(point) { eval(shape.ClientsideHandlers.OnClick); }); }
            if (shape.ClientsideHandlers.OnVisibilityChanged) { GEvent.addListener(jShape, "visibilitychanged", function(visible) { eval(shape.ClientsideHandlers.OnVisibilityChanged); }); }
            //lineupdated
            if (shape.ClientsideHandlers.OnLineUpdated) { GEvent.addListener(jShape, "lineupdated", function() { eval(shape.ClientsideHandlers.OnLineUpdated); }); }
            jShape.ID = shape.ID;
            return jShape;
        },

        "convertToGLatLng": function(latlng) {
            var ll = new GLatLng(latlng.coordinates[1], latlng.coordinates[0]);
            return ll;
        },

        "convertToJsonLatLng": function(latlng) {
            var ll = { "coordinates": [latlng.lng(), latlng.lat(), 0] }; //{"Latitude": latlng.lat(), "Longitude": latlng.lng()};
            return ll;
        },

        "convertToJsonBounds": function(bounds) {
            return { "MaxLatitude": bounds.getNorthEast().lat(), "MaxLongitude": bounds.getNorthEast().lng(), "MinLatitude": bounds.getSouthWest().lat(), "MinLongitude": bounds.getSouthWest().lng() };
        },

        "convertToGLatLngBounds": function(bounds) {
            var gb = new GLatLngBounds(reimers.map.json.convertToGLatLng(bounds.MinLatitude, bounds.MinLongitude), reimers.map.json.convertToGLatLng(bounds.MaxLatitude, bounds.MaxLongitude));
            return gb;
        },

        "convertToJsonSize": function(size) {
            return { "Width": size.width, "Height": size.height };
        },

        "convertToGSize": function(size) {
            return new GSize(size.Width, size.Height);
        },

        "convertToJsonPoint": function(point) {
            return { "X": point.x, "Y": point.y };
        },

        "convertToGPoint": function(point) {
            return new GPoint(point.X, point.Y);
        }
    }, //End of JSON

    "microFormat": {

        "getGLatLng": function() {
            var locations = [];
            var divs = document.getElementsByTagName("div");
            for (var i = 0; i < divs.length; i++) {
                if (divs[i].className == 'geo') {
                    try {
                        var lls = divs[i].getElementsByTagName("span");
                        var llat;
                        var llng;
                        for (var j = 0; j < lls.length; j++) {
                            if (lls[j].className == 'latitude') { llat = parseFloat(lls[j].innerHTML); }
                            if (lls[j].className == 'longitude') { llng = parseFloat(lls[j].innerHTML); }
                        }
                        locations.push(new GLatLng(llat, llng));
                    } catch (err) { }
                }
            }
            return locations;
        },

        "getJsonLatLng": function() {
            var locations = [];
            var divs = document.getElementsByTagName("span");
            for (var i = 0; i < divs.length; i++) {
                if (divs[i].className == 'geo') {
                    try {
                        var lls = divs[i].getElementsByTagName("span");
                        var llat;
                        var llng;
                        for (var j = 0; j < lls.length; j++) {
                            if (lls[j].className == 'latitude') { llat = parseFloat(lls[j].innerHTML); }
                            if (lls[j].className == 'longitude') { llng = parseFloat(lls[j].innerHTML); }
                        }
                        locations.push({ "Latitude": llat, "Longitude": llng });
                    } catch (err) { }
                }
            }
            return locations;
        }
} //End of microFormat
    }