  var gmap;

  /**
   * setMarker(position)
   * setMarker(position, ?opts)
   * setMarker(position, ?opts, ?msg)
   *
   * setMarker(position, ?msg)
   *
   * @RETURN the Marker created
   */
  function addMarker(arg0, arg1, arg2) {
    var args = getParams(addMarker.arguments, {position: "object", opts: "object", msg: "string"});
    if (!args.position) return;
    if (args.opts) {
		  m = new GMarker(args.position, args.opts);
		  if (args.opts.draggable) {
  		  m.enableDragging(); //IE FIX
  		}
		} else {
		  m = new GMarker(args.position);
		}
		if (args.msg) {
		  m.bindInfoWindowHtml(args.msg/*, {maxWidth: 80}*/);
		}
		gmap.addOverlay(m);
		return m;
  }

  function wheel(event) {
  	if (!event) event = window.event;
  	// prevents browser from scrolling during scroll in map
	  if (event.preventDefault) event.preventDefault();
  	event.returnValue = false;
    }
  /**
   * @PARAM opts
   *   literal:
   *     {mapContainer: HTMLContainer, transformControl: GMapControl, typeControl: GMapTypeControl, mouseZoomable: Boolean}
   */
  function initMap(opts) {
    if (!opts.mapContainer) {
			return false;
		}
    if (!GBrowserIsCompatible(opts.mapContainer)) {
      opts.mapContainer.style.display = "none";
			return false;
		}
		gmap = new GMap2(opts.mapContainer);
		gmap.enableContinuousZoom();

		gmapTransCtrl = new GSmallMapControl();
	    gmap.addControl(gmapTransCtrl);
	    var pos = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(4, 4));
	    //gmap.addMapType(G_PHYSICAL_MAP);
	    gmapTypeCtrl = new GMapTypeControl();
	    gmap.addControl(gmapTypeCtrl, pos);

		if (opts.mouseZoomable && opts.mouseZoomable == true) {
    	if (window.addEventListener) {
        opts.mapContainer.addEventListener('DOMMouseScroll', wheel, false);
        }
    	opts.mapContainer.onmousewheel = wheel;
		  gmap.enableScrollWheelZoom();
		  //gmap.enableContinuousZoom();
		  }
		if (opts.transformControl) {
  		gmap.addControl(opts.transformControl);
  		}
		if (opts.typeControl) {
		  gmap.addControl(opts.typeControl);
		  }
		window.onunload = GUnload;
		return true;
  }

  /**
   * Draw circle with given radius
   */
  function drawCircle(center, radius, color, thickness, opacity) {
    var circleQuality = 5
    var d2r = Math.PI / 180;
    var r2d = 180 / Math.PI;
    var lat = (radius / 6378.137) * r2d;
    var lng = lat / Math.cos(center.lat() * d2r);
    var points = [];
    for (var i = 0; i < 360; i += circleQuality) {
      var theta = i * d2r;
      var p = new GLatLng(
        center.lat() + (lat * Math.sin(theta)),
        center.lng() + (lng * Math.cos(theta))
      );
      points.push(p);
    }
    points.push(points[0]);
    line = new GPolyline(points, color, thickness, opacity, {clickable: false, geodesic: false});
    gmap.addOverlay(line);
    return line;
  }

  /**
   * Simply draw 2 crossing lines
   */
  function drawCross(center, radius, color, thickness, opacity) {
    var d2r = Math.PI / 180;
    var r2d = 180 / Math.PI;
    var lat = (radius / 6378.137) * r2d;
    var lng = lat / Math.cos(center.lat() * d2r);
    var points = [];
    var lat = (radius / 6378.137) * r2d;
    var lng = lat / Math.cos(center.lat() * d2r);
    for (var i = 45; i < 360; i += 180) {
      var theta = i * d2r;
      var p = new GLatLng(
        center.lat() + (lat * Math.sin(theta)),
        center.lng() + (lng * Math.cos(theta))
      );
      points.push(p);
    }
    points.push(points[0]);
    line1 = new GPolyline(points, color, thickness, opacity, {clickable: false, geodesic: false});
    gmap.addOverlay(line1);

    var points = [];
    var lat = (radius / 6378.137 / 2) * r2d;
    var lng = lat / Math.cos(center.lat() * d2r);
    for (var i = 135; i < 360; i += 180) {
      var theta = i * d2r;
      var p = new GLatLng(
        center.lat() + (lat * Math.sin(theta)),
        center.lng() + (lng * Math.cos(theta))
      );
      points.push(p);
    }
    points.push(points[0]);
    line2 = new GPolyline(points, color, thickness, opacity, {clickable: false, geodesic: false});
    gmap.addOverlay(line2);
    return [line1, line2];
  }


  /**
   * Size Map Up and down
   */
	MinMaxLink = function (parent, map, w1, h1, w2, h2, steps, homePos, baseZoomReel) {
	  steps = steps != null ? steps : 10;
	  linkObject = xmlElement('div', {id: 'gmapSizeLink'});
    linkObject.minMaxLink = xmlElement('a', {id: 'minMaxLink'}, 'Ansicht vergrößern');
    linkObject.minMaxLink.style.cursor = 'pointer';
    linkObject.appendChild(linkObject.minMaxLink);

    linkObject.maximized = false;

    linkObject.sizeMap = function() {
      parent.style.width = map.style.width;
      parent.style.height = map.style.height;

      map.style.display = 'none';
      this.style.visibility = 'hidden';

      if (linkObject.maximized) {
  		//gmap.removeControl(gmapTransCtrl);
  		//gmap.removeControl(gmapTypeCtrl);
        this.innerHTML = 'Ansicht vergrößern';
        var w = w2;
        var h = h2;
        var dw = (w1 - w2) / steps;
        var dh = (h1 - h2) / steps;
      } else {
        this.innerHTML = 'Ansicht verkleinern';
        var w = w1;
        var h = h1;
        var dw = (w2 - w1) / steps;
        var dh = (h2 - h1) / steps;
      }

      var center = gmap.getBounds().getCenter();
      var i = 0;
      var nw = w1, nh = h1;
      var sizeInterval = window.setInterval(
        function() {
          if (i > steps) {
            window.clearInterval(sizeInterval);
            map.style.width = nw + 'px';
            map.style.height = nh + 'px';
            //gmapTransCtrl = new GLargeMapControl();
        	  //gmap.addControl(gmapTransCtrl);
        	  //var pos = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(5, 5));
        			//gmap.addMapType(G_PHYSICAL_MAP);
              //gmapTypeCtrl = new GMapTypeControl();
        	  //gmap.addControl(gmapTypeCtrl, pos);
              if (!linkObject.maximized) {
              	//
        	  }else {
              	//gmap.setMapType(G_NORMAL_MAP); //(G_PHYSICAL_MAP);
              }
            map.style.display = '';
            gmap.checkResize();
            if (!linkObject.maximized || homePos == null || baseZoomReel == null){
              gmap.setCenter(center);
            }else{
              gmap.setCenter(homePos, baseZoomReel);
            }
            linkObject.minMaxLink.style.visibility = 'visible';
            linkObject.maximized = !linkObject.maximized;
            return;
          }
          nw = w + Math.round(i * dw);
          nh = h + Math.round(i * dh);
          parent.style.width = nw + 'px';
          parent.style.height = nh + 'px';
          i++;
          },
        10
        );
      this.blur();
      }
		$(linkObject.minMaxLink).addEvent('click', linkObject.sizeMap);
    //addEvent(linkObject.minMaxLink, 'click', linkObject.sizeMap);

    parent.appendChild(linkObject);
    return linkObject;
    }


