     var map=null;
     var geocoder=null;
     var mrk=null;
     var lastMarker = null;

     var LIMIT = 150;
     var currentLat=55.75571349188569;
     var currentLng=37.61787414550781;

     function load(lat,lng,zml)
     {
       if(GBrowserIsCompatible())
        {
         var opts = {
           googleBarOptions : {
           style : 'new',
           adsOptions : {
            client : 'partner-pub-9490590989861158'
           }
          }
         }

         map=new GMap2(document.getElementById("map"), opts);
         geocoder=new GClientGeocoder();

         map.addMapType(G_SATELLITE_3D_MAP);

         map.enableScrollWheelZoom();
         map.enableContinuousZoom();

         initMap(lat,lng,zml);

         map.addControl(new GLargeMapControl());
         //map.addControl(new GOverviewMapControl(new GSize(250,135)));
         map.addControl(new ExtMapTypeControl({showTraffic: true, showTrafficKey: true}));
                
         map.enableGoogleBar(); 
         
         GEvent.addListener(map,"moveend",function()
         {
          var lat = map.getCenter().lat();
          var lng = map.getCenter().lng();
          setCookie('gllat',lat,365);
          setCookie('glltd',lng,365);
          setCookie('glzml',map.getZoom(),365);          
         });
       
         GEvent.addListener(map, "click", clickFunction);

         //map.addOverlay(new GLayer("com.panoramio.all"));
         //map.addOverlay(new GLayer("org.wikipedia.ru"));

         var publisher_id = "pub-9490590989861158"; 

         var adPos = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(7, 70)); 

         adsManagerOptions = {
         maxAdsOnMap : 2,
         style: 'adunit',
         channel: '', 
         position: adPos
        };

      adsManager = new GAdsManager(map, publisher_id, adsManagerOptions);
      adsManager.enable();

      start();

        }       
      }

     function clickFunction(overlay, latlng) {
      if (latlng) 
      {
        geocoder.getLocations(latlng, function(addresses) {
          if(addresses.Status.code != 200) {
              alert("Google reverse geocoder failed to find an address for " + latlng.toUrlValue()+" Reason: "+addresses.Status.code);
          }
          else 
          { address = addresses.Placemark[0];
            var myHtml = address.address;
            map.openInfoWindow(latlng, myHtml); }
        });
      }
    }

     function SetMarker(map)
     {
        if (mrk) 
        {
          mrk = false;
          if (lastMarker)
          {
             map.removeOverlay(lastMarker);
             lastMarker = null;
          }
        }
        else
        {
          mrk = true; 
          var lat = map.getCenter().lat();
          var lng = map.getCenter().lng();
          var point = new GLatLng(lat, lng);
          var t = "Lat:"+lat + " Lng:"+lng;

          lastMarker = new GMarker(point,{title:t});
          map.addOverlay(lastMarker);
          GEvent.addListener(lastMarker, "click", function() {
          var myHtml = "<b>Lat:</b> " + lat +" <br><b>Lng:</b> "+lng
                     + "<br/><b>Local:</b> "
                     + "<a title='Local news' target='_blank' href='http://tgazeta.linkstore.ru?lat="+lat+"&lng="+lng+"'>news</a>"
                     + " &nbsp; <a title='Local people' target='_blank' href='http://lt.linkstore.ru?lat="+lat+"&lng="+lng+"'>people</a>"
                     + " &nbsp; <a title='Local photo' target='_blank' href='http://twpic.linkstore.ru?lat="+lat+"&lng="+lng+"'>photo</a>"
                     + "<br/><b>Misc:</b> "
                     + " <a title='Local search' target='_blank' href='http://geo.linkstore.ru?lat="+lat+"&lng="+lng+"'>search</a>"
                     + " &nbsp; <a title='ask question' target='_blank' href='http://geotalk.linkstore.ru?lat="+lat+"&lng="+lng+"'>forum</a>"
                     + " &nbsp; <a title='buy&sell' target='_blank' href='http://kp.linkstore.ru?lat="+lat+"&lng="+lng+"'>buy&sell</a>";
            map.openInfoWindowHtml(point, myHtml);
          });
        } 
         
     }

     function initMap(_lat,_lng,_zml)
     {
      var lat,lng,zml;

      if (_lat) lat = _lat;
      else 
       lat = getCookie('gllat');

      if (lat.length==0) lat = 55.68455275165637;

      if (_lng) lng = _lng;
      else 
       lng = getCookie('glltd');

      if (lng.length==0) lng = 37.733917236328125;

      if (_zml) zml = _zml;
      else 
       zml = getCookie('glzml');

      if (zml.length==0) zml=10;

      map.setCenter(new GLatLng(lat,lng),parseInt(zml));
     }

      function getExpirydate( nodays)
      {
        var UTCstring;
        Today = new Date();
        nomilli=Date.parse(Today);
        Today.setTime(nomilli+nodays*24*60*60*1000);
        UTCstring = Today.toUTCString();
        return UTCstring;
      }

      function getCookie(cookiename) 
      {
      var cookiestring=""+document.cookie;
       var index1=cookiestring.indexOf(cookiename);
       if (index1==-1 || cookiename=="") return ""; 
       var index2=cookiestring.indexOf(';',index1);
       if (index2==-1) index2=cookiestring.length; 
       return unescape(cookiestring.substring(index1+cookiename.length+1,index2));
      }

     function setCookie(name,value,duration)
     {
      cookiestring=name+"="+escape(value)+";EXPIRES="+getExpirydate(duration);
      document.cookie=cookiestring;
     }

   function beforeAction()
   {
     document.body.style.cursor = 'wait';
   }

   function afterAction()
   {
     document.body.style.cursor = 'default';
   }

   function handlerFunction(txt, xmlDoc)
   {
     sendMail(txt);
   } 

   function handlerFunction1(txt, xmlDoc)
   {
     sendFacebook(txt);
   } 

   function handlerFunction2(txt, xmlDoc)
   {
     sendTwitter(txt);
   } 

   function errorFunction()
   {
     alert("Could not create URL for this map");
   }


   function sendMail(sUrl)
   {
     var subjectLine='Take a look at this map from http://checkin.linkstore.ru'; 
     var bodyText='You can see this map at: '+sUrl;

     var message='mailto:?subject='+escape(subjectLine)+'&body='+escape(bodyText);
     var messageIE='mailto:?subject='+(subjectLine)+'&body='+escape(bodyText);     

     if(document.all) location.href=messageIE; 
     else  location.href=message; 
   }

   function sendTwitter(sUrl)
   { 
     var bodyText='look at this map: '+sUrl;

     var message='http://twitter.com/home?status='+escape(bodyText);

     location.href=message; 
   }

  function sendFacebook(sUrl)
  {
    var u=sUrl; t='Checkins';
    window.open('http://www.facebook.com/sharer.php?u='+encodeURIComponent(u)+'&t='+encodeURIComponent(t),'sharer','toolbar=0,status=0,width=626,height=436');
    return false;
  }

   function getUrl(map)
   {
    var center = map.getCenter();
    var sUrl="http://checkin.linkstore.ru/index.jsp?"
                 +"lng="+center.lng()
                 +"&lat="+center.lat()
                 +"&zml="+map.getZoom();
    if (mrk) sUrl+="&mrk=1";

    return sUrl;
   }


   function MailTo(map)
   {    
     var sUrl=getUrl(map);

     cjAjaxEngine("tinyurl.jsp?"+sUrl,handlerFunction,errorFunction,beforeAction,afterAction);
   }

   function sendFace(map)
   {
     var sUrl=getUrl(map);

     cjAjaxEngine("tinyurl.jsp?"+sUrl,handlerFunction1,errorFunction,beforeAction,afterAction);
   }

   function sendTwit(map)
   {
     var sUrl=getUrl(map);

     cjAjaxEngine("tinyurl.jsp?"+sUrl,handlerFunction2,errorFunction,beforeAction,afterAction);
   }

   function AddressDialog(map)
   {
      var o = document.getElementById("addressbar");
      if (o.style.display=='none') 
      {
        o.style.display="block";
        document.getElementById("idaddress").focus();
      }
      else                         o.style.display="none";
   }

   function lookupAddress(map)
   {
     var s = document.getElementById("idaddress").value;
     if (s!='')
       geocoder.getLocations(s,findCallback);
   }

  function findCallback(response)
  {
   if (!response) alert("Sorry, unable to find this");
   else
     if (response.Status.code!=200) 
       alert("Sorry, unable to find this"); 
     else
     {
       var place = response.Placemark[0];
       var lat = place.Point.coordinates[1];
       var lng = place.Point.coordinates[0];
      
       moveMap(lat,lng,15); 
       AddressDialog(map); 
     } 
  }

    function moveMap(lat,lng,zoom,mt)
    {
       var z;
       if (zoom) z = eval(zoom);
       else      z = map.getZoom();

       var m;

       if (mt) m = getGoogleMapType(mt);
       else    m = map.getCurrentMapType();

       map.setCenter(new GLatLng(eval(lat),eval(lng)),z,m);
    }
    
   function getGoogleMapType(mapType)
   {
     if (mapType=='0') return G_NORMAL_MAP;
     else
      if (mapType=='1') return G_SATELLITE_MAP;
      else
       if (mapType=='2') return G_HYBRID_MAP;

     return G_NORMAL_MAP;
   }



  var since_id='';
  var glob=1;
  var glob1=0;
  var checkins = [];
  var ara;
  var geocoded = [];
  var currentGeocoded;

  function searchTwitter(lat,lng)
   {
     var count = 20+Math.floor(Math.random()*11);
     var query="";

     if (lat!='' && lng!='')
      query+="geocode="+lat+"%2C"+lng+"%2C50mi";

     lastQuery = query;
     var s = "http://search.twitter.com/search.json";

     if (since_id!='') s+=since_id+"&lang=all&"+query+"&rpp="+count;
     else              s+="?lang=all&"+query+"&rpp="+count; 

     s+="&result_type=recent"; 

     s+="&fict="+glob;

     s+="&granularity=poi";
     
     document.getElementById("mrk3").innerHTML=""+glob + " / "+ (100*(glob1/glob)).toFixed(2)+"%";

     getTwitter(s+"&callback=results");
   }

  function getTwitter(query)
    {
      var cbscript = document.createElement("script");
      cbscript.src = query;
      cbscript.type = 'text/javascript';
      document.body.appendChild(cbscript);
    }

    function results(t)
    {
       var v ='';

       if (t) v = t.results;
       var i;

       if (!v || v.length==0)
       {
         //alert(dump(t));
         //since_id = '';
         setTimeout("start()",15000);
         return;
       }
       else
       {
        if (t.refresh_url) 
         since_id=t.refresh_url;          

         var found = 0;
         geocoded = []; 

         for (i=0; i<v.length; i++)
         { 
           var entry = v[i];
           glob++; 

//if (i==0) alert(dump(entry));

           if (isGeoCoded(entry))            
            {     
             glob1++;
             geocoded[geocoded.length]=entry;
                                
             found = 1;
            }
         }

       }

       ara = v;
       if (geocoded.length==0)
          displayFaces(0);
       else
          displayGeocoded(0);
       
    }

  function isGeoCoded(entry)
  {
    if (entry.geo) return true;
    if (!entry.place) return false;
    if (!entry.place.bounding_box) return false;

    return true;  
  }

  function getLatitude(entry)
  {
    if (entry.geo) 
    {     
      return entry.geo.coordinates[0];
    }
    else
    {  
      var box = entry.place.bounding_box.coordinates;
      var point0 = box[0][0];

      return point0[1];
    }
  }

  function getLongitude(entry)
  {
    if (entry.geo) 
      return entry.geo.coordinates[1];
    else
    {  
      var box = entry.place.bounding_box.coordinates;
      var point0 = box[0][0];

      return point0[0];
    }
  }

  function setArea()
  {
     var i = document.getElementById("city").selectedIndex;
     var v = document.getElementById("city").options[i].value;

     var ara = eval("("+v+")");
     currentLat = ara[0];
     currentLng = ara[1];

     moveMap(currentLat, currentLng);
  }

  function start()
  {
    searchTwitter(currentLat, currentLng);
  }

  function displayFaces(ind)
  {
    if (ind>=ara.length)
    {
      var spend = ara.length * 1000;
      var left = 30000 - spend + Math.floor(Math.random()*100);
      if (left<=0) left=500;
      setTimeout("start()",left);
    }
    else
      showFace(ind);     
  }

  function displayGeocoded(ind)
  {
    if (ind>=geocoded.length) displayFaces(0);
    else
      showMarker(ind);
  }

  function showFace(ind)
  {
    var entry = ara[ind];
    var s ="<img style='width:48px;height:48px;border:0' alt='' src='"+entry.profile_image_url+"'/>";
    document.getElementById("mrk").innerHTML = s;

    setTimeout("displayFaces("+(ind+1)+")",1000);
  }

 function showMarker(ind)
  {
    var entry = geocoded[ind];

    currentGeocoded = ind;

    if (sex==1) 
    {
      var s = 'http://twitter.com/users/show/'+entry.from_user+'.json?callback=TwitterLoc';

//alert(s);

      getTwitter(s);
    }
    else
      TwitterLoc(); 

      }

  function TwitterLoc(t)
  {
    var color='';

    if (t) 
     if (t.name)
       color=getColor(t.name);

   var entry = geocoded[currentGeocoded]; 

//alert("Geocoded:"+currentGeocoded+":"+geocoded.length+":"+dump(entry));

             var lat = getLatitude(entry); 
             var lng = getLongitude(entry); 
             var point = new GLatLng(lat, lng);
             var t = entry.text;
             var mrk;

             if (sex==1)
             {
               var image='/checkin/green-pushpin.png';
               if (color=='red') image='/checkin/red-pushpin.png';
               else
                if (color=='blue') image='/checkin/blue-pushpin.png';

              var Icon = new GIcon(G_DEFAULT_ICON);
              Icon.iconSize=new GSize(32,32);
              Icon.shadowSize=new GSize(56,32);
              Icon.iconAnchor=new GPoint(16,32);
              Icon.infoWindowAnchor=new GPoint(16,0); 
              Icon.image = image;

              mrk = new GMarker(point,{title:t,icon:Icon});
             }
             else
              mrk = new GMarker(point,{title:t});  
             
             map.addOverlay(mrk);

             var myHtml = proceedText(t) + "<br/>"
                     + "<small><b>Lat:</b> " + lat +" <b>Lng:</b> "+lng+ "<br/>"
                     + "<a href='http://tinfo.linkstore.ru?u="+entry.from_user+"' target='_blank'>Author</a>"                     
                     + " &nbsp; "
                     + "<a href='http://twitter.com/"+entry.from_user+"/statuses/"+entry.id_str + "' target='_blank'>Source</a></small>"                     
                     + "<div style='clear:both;padding-bottom:7px'><b>Local:</b> "
                     + "<a title='Local news' target='_blank' href='http://tgazeta.linkstore.ru?lat="+lat+"&lng="+lng+"'>news</a>"
                     + " &nbsp; <a title='Local people' target='_blank' href='http://lt.linkstore.ru?lat="+lat+"&lng="+lng+"'>people</a>"
                     + " &nbsp; <a title='Local photo' target='_blank' href='http://twpic.linkstore.ru?lat="+lat+"&lng="+lng+"'>photo</a>"
                     + "<br/><b>Misc:</b> "
                     + " <a title='Local search' target='_blank' href='http://geo.linkstore.ru?lat="+lat+"&lng="+lng+"'>search</a>"
                     + " &nbsp; <a title='ask question' target='_blank' href='http://geotalk.linkstore.ru?lat="+lat+"&lng="+lng+"'>forum</a>"
                     + " &nbsp; <a title='view QR code' target='_blank' href='http://qrmap.linkstore.ru?lat="+lat+"&lng="+lng+"'>QR code</a>"
                     + "</div>"; 

             mrk.bindInfoWindowHtml(myHtml);
                        
             if (checkins.length>LIMIT)
             {
              map.removeOverlay(checkins[0]);
              checkins.splice(0,1);
             }

             checkins[checkins.length]=mrk;

    

    setTimeout("displayGeocoded("+(currentGeocoded+1)+")",1000);

  }

   function proceedText(text)
    {
        var tweet = text;
        var re = new RegExp("(([a-zA-Z]+:\/\/)([a-zA-Z][a-zA-Z0-9_\.-]*[a-zA-Z]{2,6})([a-zA-Z0-9~\#\/\._\?\&%-=]*[a-zA-Z0-9~\#\/_\?\&%-=]))", "g");
        tweet = tweet.replace(re, '<a style="' + 'text-decoration:none;" target="_new" href=$1 >$1</a>');

        re = new RegExp("@([a-zA-Z0-9_]+)", "g");
	tweet = tweet.replace(re, '@<a style="' + 'text-decoration:none;" target="_new" href=http://tinfo.linkstore.ru?u=$1>$1</a>');

        re = new RegExp("#([a-zA-Z0-9_]+)", "g");
	tweet = tweet.replace(re, '<a style="' + 'text-decoration:none;" href=http://got.linkstore.ru?q=%23$1>#$1</a>');

        tweet = tweet.replace(/&/g, '&');

        re = new RegExp("(http://twitpic.com/)([0-9a-zA-Z]*)");
	var m = re.exec(tweet);
	if  (!m || m.length == 0 || m[2] == "photos" || m[2] == "photo" || m[2] == "tag") {} 
	else {tweet = tweet+'<br/>' + '<center><a href="http://twitpic.com/' + m[2] + '" target="_blank"><img src="http://twitpic.com/show/thumb/' + m[2] + '" border=0 height=150 width=150></a></center>';}	

         re = new RegExp("(http://yfrog.com/)([0-9a-zA-Z]*)");
	 m = re.exec(tweet);
 	 if  (!m || m.length == 0) {} 
	 else {tweet += '<br/><center><a href="http://yfrog.com/' + m[2] + '" target="_blank"><img src="http://yfrog.com/' + m[2] + '.th.jpg" border="0" style="height:150;width:150;"></a></center>';}	

         re = new RegExp("(http://img.ly/)([0-9a-zA-Z]*)");
      	 m = re.exec(tweet);
  	 if  (!m || m.length == 0) {} 
 	 else {tweet += '<br/><center><a href="http://img.ly/' + m[2] + '"><img src="http://img.ly/show/thumb/'+m[2]+'" border="0" style="height:150;width:150;"></a></center>';}	

        re = new RegExp("(http://tweetphoto.com/)([0-9a-zA-Z]*)");
     	m = re.exec(tweet);
  	if  (!m || m.length == 0) {} 
 	else {tweet += '<br/><center><a href="http://tweetphoto.com/' + m[2] + '" target="_blank"><img src="http://TweetPhotoAPI.com/api/TPAPI.svc/imagefromurl?size=medium&url=http://tweetphoto.com/' + m[2] + '" border=0 height=150 width=150></a></center>';}	

        re = new RegExp("(http://plixi.com/p/)([0-9a-zA-Z]*)");
     	m = re.exec(tweet);
  	if  (!m || m.length == 0) {} 
 	else {tweet += '<br/><center><a  href="http://plixi.com/p/' + m[2] + '" target="_blank"><img src="http://api.plixi.com/api/tpapi.svc/imagefromurl?size=medium&url=http://plixi.com/p/' + m[2] + '" border=0 height=150 width=150></a></center>';}	        

        re = new RegExp("(http://lockerz.com/s/)([0-9a-zA-Z]*)");
     	m = re.exec(tweet);
  	if  (!m || m.length == 0) {} 
 	else {tweet += '<br/><center><a  href="http://lockerz.com/s/' + m[2] + '" target="_blank"><img src="http://api.plixi.com/api/tpapi.svc/imagefromurl?size=medium&url=http://lockerz.com/s/' + m[2] + '" border=0 height=150 width=150></a></center>';}	        

        re = new RegExp("(http://farm)([0-9])(.static.flickr.com/)([0-9a-zA-Z_\.\/]*)");
     	m = re.exec(tweet);
  	if  (!m || m.length == 0) {} 
 	else {tweet += '<br/><center><a  href="'+m[0]+'" target="_blank"><img src="'+m[0]+ '" border=0 height=150 width=150></a></center>'; return tweet;}	        

        re = new RegExp("(http://twitrpix.com/)([0-9a-zA-Z]*)");
	m = re.exec(tweet);
	if  (!m || m.length == 0) {} 
	else {tweet += '<br/><center><a  href="http://twitrpix.com/' + m[2] + '" target="_blank"><img src="http://img.twitrpix.com/thumb/' + m[2] + '" border=0 height=150 width=150></a></center>'; return tweet;}	

        re = new RegExp("(http://moby.to/)([0-9a-zA-Z]*)");
	m = re.exec(tweet);
	if  (!m || m.length == 0) {} 
	else {tweet += '<br/><center><a  href="http://moby.to/' + m[2] + '" target="_blank"><img src="http://moby.to/' + m[2] + ':medium" border=0 height=150 width=150></a></center>'; return tweet;}	

        re = new RegExp("(http://twitsnaps.com/)([0-9a-zA-Z]*)");
	m = re.exec(tweet);
	if  (!m || m.length == 0) {} 
	else {tweet += '<br/><center><a  href="http://twitsnaps.com/' + m[2] + '" target="_blank"><img src="http://twitsnaps.com/thumb/' + m[2] + '" border=0 height=150 width=150></a></center>'; return tweet;}	

        re = new RegExp("(http://twitgoo.com/)([0-9a-zA-Z]*)");
	m = re.exec(tweet);
	if  (!m || m.length == 0) {} 
	else {tweet += '<br/><center><a  href="http://twitgoo.com/' + m[2] + '" target="_blank"><img src="http://twitgoo.com/' + m[2] + '/thumb" border=0 height=150 width=150></a></center>'; return tweet;}	

        re = new RegExp("(http://instagr.am/p/)([0-9a-zA-Z_\-]*)/");
	m = re.exec(tweet);
	if  (!m || m.length == 0) {} 
	else {tweet += '<br/><center><a  href="http://instagr.am/p/'+m[2] +  '/" target="_blank"><img src="http://instagr.am/p/' + m[2] + '/media?size=t" border=0 height=150 width=150></a></center>'; return tweet;}	


      return tweet;
    }


    function dump(arr,level) {
	var dumped_text = "";
	if(!level) level = 0;
	
	//The padding given at the beginning of the line.
	var level_padding = "";
	for(var j=0;j<level+1;j++) level_padding += "    ";
	
	if(typeof(arr) == 'object') { //Array/Hashes/Objects 
		for(var item in arr) {
			var value = arr[item];
			
			if(typeof(value) == 'object') { //If it is an array,
				dumped_text += level_padding + "'" + item + "' ...\n";
				dumped_text += dump(value,level+1);
			} else {
				dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
			}
		}
	} else { //Stings/Chars/Numbers etc.
		dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
	}
	return dumped_text;
}




