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(new GLatLng(marker.Latitude,marker.Longitude),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": reimers.map.json.convertToJsonLatLng(marker.getPoint()).Latitude, "Longitude" : reimers.map.json.convertToJsonLatLng(marker.getPoint()).Longitude };
            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.Latitude, latlng.Longitude);
            return ll;
        },

        "convertToJsonLatLng" : function(latlng){
            var ll = {"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);
        }
    }, //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
}