
    var gMarkers = new Array();
    var gMarkersS = new Array();
    var gMarkersVisible = new Array();

    var gZoomLevel;

    function CustomSearchControl() {
    }
    CustomSearchControl.prototype = new GControl();

    CustomSearchControl.prototype.initialize = function(map) {
      var container = document.createElement("div");

      var strInput = document.createElement("input");
      strInput.name = "address";
      strInput.id = "address";
      container.appendChild(strInput);
      var btnSearch = document.createElement("input");
      btnSearch.type = "button";
      btnSearch.value = "Показать адрес";
      container.appendChild(btnSearch);
      GEvent.addDomListener(btnSearch, "click", function() {
        showAddress (document.getElementById('address').value);
      });
      container.style.backgroundColor = "white";
      container.style.border = "1px solid black";
      container.style.padding = "3px";

      map.getContainer().appendChild(container);
      return container;
    }

    CustomSearchControl.prototype.getDefaultPosition = function() {
      return new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10, 15));
    }

    function CustomSwitcherControl() {
    }
    CustomSwitcherControl.prototype = new GControl();

    function HideMarkers (list, hide) {
      for (marker in list) {
        if (hide) {
          list[marker].hide();
        } else {
          list[marker].show();
        };
      };
    };

    CustomSwitcherControl.prototype.initialize = function(map) {
      var container = document.createElement("div");

      var btnHotels = document.createElement("p");
      this.setButtonStyle_(btnHotels);
      container.appendChild(btnHotels);
      btnHotels.appendChild(document.createTextNode("Отели"));
      GEvent.addDomListener(btnHotels, "click", function() {
        if (gZoomLevel>13) {
          HideMarkers(gMarkers[0], gMarkersVisible[0]);
        } else {
          HideMarkers(gMarkersS[0], gMarkersVisible[0]);
        };
        if (gMarkersVisible[0]) {
          gMarkersVisible[0] = false;
        } else {
          gMarkersVisible[0] = true;
        };
      });

      var btnBars = document.createElement("p");
      this.setButtonStyle_(btnBars);
      container.appendChild(btnBars);
      btnBars.appendChild(document.createTextNode("Бары"));
      GEvent.addDomListener(btnBars, "click", function() {
        if (gZoomLevel>13) {
          HideMarkers(gMarkers[1], gMarkersVisible[1]);
        } else {
          HideMarkers(gMarkersS[1], gMarkersVisible[1]);
        };
        if (gMarkersVisible[1]) {
          gMarkersVisible[1] = false;
        } else {
          gMarkersVisible[1] = true;
        };
      });

      var btnSaunas = document.createElement("p");
      this.setButtonStyle_(btnSaunas);
      container.appendChild(btnSaunas);
      btnSaunas.appendChild(document.createTextNode("Сауны"));
      GEvent.addDomListener(btnSaunas, "click", function() {
        if (gZoomLevel>13) {
          HideMarkers(gMarkers[2], gMarkersVisible[2]);
        } else {
          HideMarkers(gMarkersS[2], gMarkersVisible[2]);
        };
        if (gMarkersVisible[2]) {
          gMarkersVisible[2] = false;
        } else {
          gMarkersVisible[2] = true;
        };
      });

      var btnKrasa = document.createElement("p");
      this.setButtonStyle_(btnKrasa);
      container.appendChild(btnKrasa);
      btnKrasa.appendChild(document.createTextNode("Красота и здоровье"));
      GEvent.addDomListener(btnKrasa, "click", function() {
        if (gZoomLevel>13) {
          HideMarkers(gMarkers[3], gMarkersVisible[3]);
        } else {
          HideMarkers(gMarkersS[3], gMarkersVisible[3]);
        };
        if (gMarkersVisible[3]) {
          gMarkersVisible[3] = false;
        } else {
          gMarkersVisible[3] = true;
        };
      });


      map.getContainer().appendChild(container);
      return container;
    }

    CustomSwitcherControl.prototype.getDefaultPosition = function() {
      return new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(10, 15));
    }

    CustomSwitcherControl.prototype.setButtonStyle_ = function(button) {
      button.style.textDecoration = "underline";
      button.style.backgroundColor = "white";
      button.style.border = "1px solid black";
      button.style.padding = "2px";
      button.style.marginBottom = "3px";
      button.style.textAlign = "center";
      button.style.width = "6em";
      button.style.cursor = "pointer";
    }

    var geocoder = null;
    var map;

    function ParseMarkers (data, icon, icon_sm, type) {
      gMarkersVisible[type] = true;
      gMarkers[type] = new Array();
      gMarkersS[type] = new Array();

        var xml = GXml.parse(data);
        var markers = xml.documentElement.getElementsByTagName("marker");
        for (var i = 0; i < markers.length; i++) {
          var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
                                  parseFloat(markers[i].getAttribute("lng")));
          var strname = markers[i].getAttribute("name");
          var mid = gMarkers[type].length;

          gMarkers[type][mid] = new GMarker(point, {icon: icon, title:strname} );
          gMarkers[type][mid].text = markers[i].getAttribute("text");
          GEvent.addListener(gMarkers[type][mid], "click", function() {
            this.openInfoWindowHtml(this.text);
          });

          gMarkersS[type][mid] = new GMarker(point, {icon: icon_sm, title:strname} );
          gMarkersS[type][mid].text = markers[i].getAttribute("text");
          GEvent.addListener(gMarkersS[type][mid], "click", function() {
            this.openInfoWindowHtml(this.text);
          });

          map.addOverlay(gMarkers[type][mid]);
          map.addOverlay(gMarkersS[type][mid]);

          if ((gLat==point.lat())&&(gLng = point.lng())) {
            gMarkers[type][mid].openInfoWindowHtml(gMarkers[type][mid].text);
            map.setZoom(16);
          };
          if (gZoomLevel<=13) {
            HideMarkers(gMarkers[type], true); 
          } else {
            HideMarkers(gMarkersS[type], true); 
          };
        };
    };
    function LoadMarkers (strURL, icon, icon_sm, type) {
      GDownloadUrl(strURL, function(data) {
        ParseMarkers(data, icon, icon_sm, type);
      });
    };

    var baseIcon;
    var baricon;
    var hotelicon;
    var bankicon;
    var saunaicon;
    var krasaicon;

    var smallIcon;
    var baricon_sm;
    var hotelicon_sm;
    var bankicon_sm;
    var saunaicon_sm;
    var gLat=0;
    var gLng=0;

    function load() {
      if (GBrowserIsCompatible()) {
        var params = document.location.search.split(",");
            gLat = 58.0276;
            gLng = 56.222277;
        if (params[0]) {
          params[0] = params[0].slice(1);
          gLat = params[0] - 0;
          gLng = params[1] - 0;
          if (isNaN(gLat+gLng)) {
            gLat = 58.0276;
            gLng = 56.222277;
          };
        };

        map = new GMap2(document.getElementById("map"));
//        map.enableScrollWheelZoom();

        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
        map.addControl(new CustomSearchControl());
        map.addControl(new CustomSwitcherControl());
        GEvent.addListener (map, "zoomend", function (oldLevel, newLevel) {
          gZoomLevel = newLevel;
            if ((oldLevel>=13)&&(newLevel<=13)) {
              for (m in gMarkers) {
                HideMarkers(gMarkers[m], true);
                if (gMarkersVisible[m]) HideMarkers(gMarkersS[m], false);
              };
            } else if ((oldLevel<=14)&&(newLevel>=14)) {
              for (m in gMarkers) {
                if (gMarkersVisible[m]) HideMarkers(gMarkers[m], false);
                HideMarkers(gMarkersS[m], true);
              };
            };
          });

        map.setCenter(new GLatLng(gLat, gLng), 13);

        baseIcon = new GIcon();
        baseIcon.shadow = "http://gid.perm.ru/icon/hotel_sh.png";
        baseIcon.iconSize = new GSize(20, 34);
        baseIcon.shadowSize = new GSize(37, 34);
        baseIcon.iconAnchor = new GPoint(9, 34);
        baseIcon.infoWindowAnchor = new GPoint(9, 2);
        baseIcon.infoShadowAnchor = new GPoint(18, 25);
    
        hotelicon = new GIcon(baseIcon);
        hotelicon.image = "http://gid.perm.ru/icon/hotel.png";
        baricon = new GIcon(baseIcon);
        baricon.image = "http://gid.perm.ru/icon/bar.png";
        saunaicon = new GIcon(baseIcon);
        saunaicon.image = "http://gid.perm.ru/icon/sauna.png";
        krasaicon = new GIcon(baseIcon);
        krasaicon.image = "http://gid.perm.ru/icon/kz.png";

        smallIcon = new GIcon();
        smallIcon.shadow = "http://gid.perm.ru/icon/hotel_sh_sm.png";
        smallIcon.iconSize = new GSize(10, 17);
        smallIcon.shadowSize = new GSize(18, 17);
        smallIcon.iconAnchor = new GPoint(4, 17);  
        smallIcon.infoWindowAnchor = new GPoint(4, 1);
        smallIcon.infoShadowAnchor = new GPoint(9, 13);       
      
        hotelicon_sm = new GIcon(smallIcon);
        hotelicon_sm.image = "http://gid.perm.ru/icon/hotel_sm.png";
        baricon_sm = new GIcon(smallIcon);
        baricon_sm.image = "http://gid.perm.ru/icon/bar_sm.png";
        saunaicon_sm = new GIcon(smallIcon);
        saunaicon_sm.image = "http://gid.perm.ru/icon/sauna_sm.png";
        krasaicon_sm = new GIcon(smallIcon);
        krasaicon_sm.image = "http://gid.perm.ru/icon/kz_s.png";

        var tt=new Date;
        geocoder = new GClientGeocoder();

        LoadMarkers ("/cgi-bin/getmarkers.cgi?"+tt.getTime(), hotelicon, hotelicon_sm, 0);
        LoadMarkers ("/cgi-bin/getm_bars.cgi?"+tt.getTime(), baricon, baricon_sm, 1);
        LoadMarkers ("/cgi-bin/getm_krasa.cgi?"+tt.getTime(), krasaicon, krasaicon_sm, 3);
        ParseMarkers (strSaunaMarkers, saunaicon, saunaicon_sm, 2);
      }
    }
    function showAddress(address) {
      if (geocoder) {
        geocoder.getLatLng(
          "Russia, Perm, "+address,
          function(point) {
            if ((point.lat() == 57.9971695)&&(point.lng() == 56.2352792)) {
              alert(address + " не найдено");
            } else {
              map.setCenter(point, 16);
//map.showMapBlowup(point, {zoomLevel:16});
              map.openInfoWindowHtml(point, address);
            }
          }
        );
      }
    }


