var gScriptLoadedCallback = null; 

  var gmap        = null; 
  var pgGeocoder  = null; 
  var pgFirstTime = true;
  
  

  
  var pgMapCanvasClientID = 'GMapsID';  
  var pgBaseMapIconPathGo = '/themes/admin/images/gmap/';
  var pgBaseMapIconHouse = 'house-ico.png';
  var pgBaseMapIconHouseShadow = 'ico-shadow.png';  

  ////var pgErrorContainerClientID = '<%=lblAddressNotFound.ClientID%>';   
  ////var pgMarkerManager          = null;
  ////var pgLastPointClicked        = null;
  ////var pgIsAddMarkerByMapClick   = false;

  function createIcon(iconName,iconShadowName)
  {
    var icon = new GIcon();
    //icon.image = "" + iconName + ".png";
    icon.image = pgBaseMapIconPathGo + iconName;
    icon.shadow = pgBaseMapIconPathGo + iconShadowName;
    //icon.image = "http://cms/green-10-10-pin.png";

    icon.iconSize = new GSize(17, 29);
    icon.iconAnchor = new GPoint(10, 39);
    //icon.infoWindowAnchor = new GPoint(0, 0);
    //icon.infoShadowAnchor = new GPoint(0, 0);  
    return icon;
  }

  function createMarker(pMapGo, latlng, message)  //, number)  iconname - TODO
  {
  
    var pIcon   = createIcon(pgBaseMapIconHouse,pgBaseMapIconHouseShadow);   //('snow'); 'headquarters'
    var marker  = new GMarker( latlng, { icon: pIcon } );
    
    GEvent.addListener(marker, "click", function() 
    {
      var myHtml = message;
      marker.openInfoWindowHtml(myHtml);
    });
    return marker;
  }

//  YMaps.load = function (callback) {
//                      if (typeof callback == 'function') {
//                          callback();
//                      }
                  
  function MapScriptsLoaded() //(mapContainerID)
  {
    //debugger;
    var mapContainer  = document.getElementById(pgMapCanvasClientID); //(mapContainerID); //(pgMapCanvasClientID);
    gmap = new GMap2(mapContainer); //set global gmap var once 

    var pMapGo = gmap;
    //pMapGo.addControl(new GLargeMapControl());
    //pMapGo.addControl(new GMapTypeControl(true));
    pMapGo.addControl(new GMenuMapTypeControl(true));
    
    //pMapGo.addControl(new GScaleControl());
        
    if(!pMapGo.scrollWheelZoomEnabled()){
	    pMapGo.enableScrollWheelZoom();
    }

	if(!pMapGo.continuousZoomEnabled()){
		pMapGo.enableContinuousZoom();
	}
	
    OnMapScriptsLoaded();
  }
  
  function OnMapScriptsLoaded() 
  {
    if(typeof gScriptLoadedCallback == 'function') 
    {
      gScriptLoadedCallback();
    }
    gScriptLoadedCallback = null;
  }
  
  //To call:
  //  LoadGoogleMaps(function () {DisplayAddressGMapTb('pPanYMaps', 'lblAddressNotFound', 'pTbAddress' , false);} );
  
  function LoadGoogleMaps(ScriptLoadedCallback, pgGoogleKey) //(inputKey)
  {  
  
    //debugger;   
    gScriptLoadedCallback = ScriptLoadedCallback;
    if (!pgGeocoder)
    {
      var scriptText = 'http://maps.google.com/maps?file=api&v=2.x&async=2&callback=' + 'MapScriptsLoaded' + '&oe=windows-1251&hl=ru&key=' + pgGoogleKey; 
      var head = document.getElementsByTagName("head")[0];
      var newScript = document.createElement('script');
      if(head != null && newScript != null)
      {
        newScript.type = 'text/javascript';
        newScript.src  = scriptText;
        //newScript.setAttribute('charset', 'UTF-8');                  
        //newScript.charset  = 'UTF-8';
        newScript.charset  = 'windows-1251';
        //newScript.charset  = 'en/us';
        //newScript.charset = "ru/russian";
        head.appendChild(newScript);
      }
      
      
    }
    else
    {
      OnMapScriptsLoaded();
    }
  }

  function UnloadGoogleMaps()
  {
    //debugger;
    if(pgGeocoder)  
    {
      GUnload();
    }
    pgGeocoder = null;
  }

  function DisplayAddressGMapTb(mapContainerID, errContainerID, pAddressClientID, showFoundAddress) 
  {
    //debugger;
    var pTbAddr   = document.getElementById(pAddressClientID);
    var pAddress  = pTbAddr.value;
    DisplayAddressGMap(mapContainerID, errContainerID, pAddress, pAddress, showFoundAddress);
  }

  function DisplayAddressGMap(mapContainerID, errContainerID, address, dispMessage, showFoundAddress, pgInitZoomLevel)
  {
    //debugger;
    //ClearLocation(mapContainerID, errContainerID);
    
    if(address.length == 0) alert('Адрес не указан');
    else getGMapForGeocode(mapContainerID, errContainerID, address, dispMessage, showFoundAddress, pgInitZoomLevel);
  }       

  function refreshMap()
  {
    gmap.checkResize();
  }

  function ClearLocation(mapContainerID, errContainerID)
  {
    var mapContainer = document.getElementById(mapContainerID);
    var errContainer = document.getElementById(errContainerID);
    try
    {
      if(errContainer) errContainer.innerText = "";
      if(mapContainer)
      {
        //while(mapContainer.childNodes.length > 0) {  mapContainer.removeChild(mapContainer.childNodes[0]); }
      }
    }
    catch(ex) {}
  }

  function ClearMarkers() //(mapContainerID)
  {
    try {gmap.clearOverlays(); }  catch(ex) {}
  }

  function EnsureGeocoder()
  {
    if (!pgGeocoder && GBrowserIsCompatible())
    {
      pgGeocoder = new GClientGeocoder();
    }
  }

  function setGoogleMapOnce(pMapGo, point)
  {
  //  pMapGo.addControl(new GLargeMapControl());
  //  pMapGo.addControl(new GMapTypeControl());
  //  pMapGo.addControl(new GScaleControl());
  //  
  //  pMapGo.setCenter(point, pgInitZoomLevel);
  //  
  //  //var latlng = new GLatLng(34.05406, -117.193164) ; 
  //  //pMapGo.setCenter(latlng, 15);
  }

    function str_replace(search, replace, subject) {
        return subject.split(search).join(replace);
    }
  function getGMapForGeocode(mapContainerID, errContainerID, searchAddress, displayAddress, showFoundAddress, pgInitZoomLevel)
  {
    //debugger;
    var pMapGo = gmap;   //gmap is global
    var mapContainer  = document.getElementById(mapContainerID);
    var errContainer  = errContainerID ? document.getElementById(errContainerID) : null; 
    try
    {
      EnsureGeocoder();
      if (!pgGeocoder) return false;
      
      pgGeocoder.getLocations(searchAddress, function(result)
      {
      	
        if (!result)
        {
          if(errContainer) errContainer.innerText = searchAddress + " not found";
          return false;
        }
        else
        {
          try
          {
            //debugger;
            var pGeoResultStatusCode = result.Status.code;
            if(pGeoResultStatusCode != G_GEO_SUCCESS) //GGeoStatusCode.G_GEO_SUCCESS
            {
                
                var myString = searchAddress;
                
                var addrSplitResult = myString.split(",");
                var searchAddressLess = '';
                var zpt = '';
                if(addrSplitResult.length>1)
                {
                    for(var i = 0;i < addrSplitResult.length-1; i++)
                    {
                        searchAddressLess += zpt + addrSplitResult[i];
                        if(!zpt)
                            zpt = ',';
                    }
                    
                    if(pgInitZoomLevel > 10)
                        pgInitZoomLevel = pgInitZoomLevel-5;
                    getGMapForGeocode(mapContainerID, errContainerID, searchAddressLess, displayAddress, showFoundAddress, pgInitZoomLevel);
                }

              
              
              if(errContainer) errContainer.innerText = '[' + searchAddress + '] not found.'; // ErrorCode=' + pGeoResultStatusCode;
              return false;
            }
            else
            {       
              //debugger;
              if(result.Placemark.length > 0)
              {
                var pPlacemark = result.Placemark[0];   // GLatLng(lat, lng, unbounded?)  (y, x)
                var point = new GLatLng(pPlacemark.Point.coordinates[1], pPlacemark.Point.coordinates[0]);
                
                var pFullAddress = pPlacemark.address;
                var pAccuracy = pPlacemark.AddressDetails.Accuracy;
                var pLocality = pPlacemark.AddressDetails.Country.AdministrativeArea.Locality;
                var pZipCode  = '';
                
                if(pLocality)
                {
                  if(pLocality.PostalCode)
                  {
                    pZipCode = pLocality.PostalCode.PostalCodeNumber;
                  }
                  else
                  {
                    if(pLocality.DependentLocality && pLocality.DependentLocality.PostalCode
                                    && pLocality.DependentLocality.PostalCode.PostalCodeNumber)
                    {
                      pZipCode = pLocality.DependentLocality.PostalCode.PostalCodeNumber;
                    }
                  }
                }
                      
                //debugger;      
                if(pgFirstTime) 
                {
                  //setGoogleMapOnce(pMapGo, point);
                  pMapGo.setCenter(point, pgInitZoomLevel);
                }  
                else            
                { 
                  //pMapGo.setCenter(point);
                }
                
                pgFirstTime = false;             
                
                
                //Маркер Balloon
                
                var ssAddr   = showFoundAddress ? pFullAddress : displayAddress;
                //var sHtmlMsg = ssAddr + '<br/><b>' + pZipCode + '</b>&nbsp;&nbsp; x=' + point.x + ' y=' + point.y;
                var sHtmlMsg = ssAddr;
                var marker   = createMarker(pMapGo, point, sHtmlMsg);
                
                pMapGo.addOverlay(marker);
                //marker.openInfoWindowHtml(sHtmlMsg);
                

                window.setTimeout(refreshMap, 10);
              }
            }
          }
          catch(ex)
          {
            errContainer.innerText = 'An error occurs while processing the request. Error: ' + ex.message;
          }
        }
      } );
      return true;
    }
    catch(ex2)
    {
      errContainer.innerText = 'Unable to connect to google pMapGo service. Error: ' + ex2.message;
      return false;
    }
  }
