
 var s = "";

 var urlRegex = new RegExp("([^:]*):[/]*(?:www\.)*([^/]+)([^\?]*)(.*)");
 var spaceRegex =new RegExp("[ \t\n\r+]+","g");
 var scale=2; 

 var lastUser='';

 var MAX_COUNT = 256;
 var MAX_CLOUD = 20;
 var MAX_LINKS = 20;

var stopwords = [ "a", "about", "above", "accordingly", "after",
  "again", "against", "ah", "all", "also", "although", "always", "am", "among", "amongst", "an",
  "and", "any", "anymore", "anyone", "are", "as", "at", "away", "be", "been",
  "begin", "beginning", "beginnings", "begins", "begone", "begun", "being",
  "below", "between", "but", "by", "ca", "can", "cannot", "come", "could",
  "did", "do", "doing", "during", "each", "either", "else", "end", "et",
  "etc", "even", "ever", "far", "ff", "following", "for", "from", "further", "furthermore",
  "get", "give", "go", "goes", "going", "got", "had", "has", "have", "he", "her",
  "hers", "herself", "him", "himself", "his", "how", "i", "if", "in", "into",
  "is", "it", "its", "itself", "last", "lastly", "less", "many", "may", "me",
  "might", "more", "must", "my", "myself", "near", "nearly", "never", "new",
  "next", "no", "not", "now", "o", "of", "off", "often", "oh", "on", "one", "only",
  "or", "other", "otherwise", "our", "ourselves", "out", "over", "perhaps",
  "please", "put", "puts", "quite", "s", "said", "saw", "say", "see", "seen", "shall",
  "she", "should", "since", "so", "some", "such", "t", "than", "thanks", "that", "the",
  "their", "them", "themselves", "then", "there", "therefore", "these", "they",
  "this", "those", "though", "throughout", "thus", "to", "too",
  "toward", "unless", "until", "up", "upon", "us", "ve", "very", "was", "we",
  "were", "what", "whatever", "when", "where", "which", "while", "who",
  "whom", "whomever", "whose", "why", "with", "within", "without", "would",
  "yes", "your", "yours", "yourself", "yourselves" ];

 function isStop(s)
 {
 
  for (var i=0; i<stopwords.length; i++)
  {
    if (s==stopwords[i]) return true;
  }

  return false;

 }

 function linkurl(url, keepPath, addIcon) 
 {
  urlbits = urlRegex.exec(url);
  imgtxt = "";
  if (addIcon && urlbits[1]=='http') {
    imgtxt = ['<img src="http://',urlbits[2],'/favicon.ico" class="favicon" width="16" />'].join('');
  }
  if (keepPath) {
    visualUrl = [urlbits[2],urlbits[3]].join('');
  } else {
    visualUrl = [urlbits[2]];
  }
  return [imgtxt,' <a class=\'link1\' href="',url,'" target=\'_blank\'>',visualUrl,'</a>'].join('');
 }

 function lookup()
 {
   var v = document.forms['mf'].u.value;

   if (v=='') return false;

   document.forms['mf'].submit();
 
   return true;
 }
 

function getMap(lat,lng, cl)
{
  var s = "<a";
  if (cl)
    s+=" class='"+cl+"'";

  s+=" href='http://bigmap.linkstore.ru?lat="+lat
   + "&lng="+lng
   + "&zml=10"
   + "&mrk=1"         
   + "' target='_blank'>"
   + lat+","+lng
   +"</a>";

  return s;
}

function TwitterLoc(t)
{
  if (!t) return;

  var o = document.getElementById("location");
  var name = t.screen_name;
  var loc = t.location;
  var s='';

  if (loc)
  {
    re = new RegExp("([-]?[0-9]{1,3}.[0-9]+),([-]?[0-9]{1,3}.[0-9]+)","g");
    loc = loc.replace(re, getMap('$1','$2'));
    s += loc+"<br/>&nbsp;<br/>";
  }

  if (t.description)
  {
    s+="<div style='text-align:left'><strong>Bio:</strong> "+t.description;
    s+="</div>";
  }

  if (t.url)
  {
    s+="<div style='text-align:left'><strong>URL:</strong> <a href='"+t.url+"' target='_blank'>"+t.url+"</a>";
    s+="</div>";
  }

  s+="<div style='text-align:left'>";
  s+="<strong>Since:</strong> "+t.created_at+"<br/>";
  if (t.verified)
    s+="<strong>Veirifed:</strong> "+t.verified+"<br/>";
  if (t.geo_enabled)
    s+="<strong>Geo enabled:</strong> "+t.geo_enabled+"<br/>";
  if (t.protected)
    s+="<strong>Protected:</strong> "+t.protected+"<br/>";
  if (t.time_zone)
    s+="<strong>Time zone:</strong> "+t.time_zone+"<br/>";
  s+="</div>";
   
  s+= "<table border='0' cellpadding='5px' cellspacing='7px'>"
   +  "<tr><td>"
   +  "<span id='following_count' class='number'>"+t.friends_count+"</span><br/>"
   +  "<a href='http://twitter.com/"+name+"/following' id='following_count_link' class='stat' rel='"+name+"' title='See who he/she is following' target='_blank'>"
   +  "<span class='label'>following</span>"
   +  "</a>"
   +  "</td><td>"
   +  "<span id='follower_count' class='number'>"+t.followers_count+"</span><br/>"
   +  "<a href='http://twitter.com/"+name+"/followers' id='follower_count_link' class='stat' rel='"+name+"' title='See who is following him/her'>"
   +  "<span class='label'>followers</span>"
   +  "</a>"
   +  "</td>"
   +  "<td>"
   +  "<span id='update_count' class='number'>"+t.statuses_count+"</span><br/>"
   +  "<a href='http://twitter.com/"+name+"' class='stat' title='See all tweets' rel='"+name+"' target='_blank'>"
   +  "<span class='label'>tweets</span>"
   +  "</a></td>"
   +  "</tr>"
   +  "</table><br/>";

  o.innerHTML = s;
}

function isAuthor(ara,a)
{
  for (var i=0; i<ara.length; i++)
  {
   if (ara[i].id==a.id) return true;
  }

  return false;
}

function addLink(links,elem)
{
  var link = getLink(elem.text);

  addLink1(links, link, elem);
}

function addLink1(links, link, elem)
{
  var o,o1;

  for (var i=0; i<links.length; i++)
  {
    o = links[i];
    if (o.link == link)
     {
       if (!isAuthor(o.authors,elem.user)) o.authors[o.authors.length] = elem.user;

       o1 = new Object();
       o1.text = elem.text;
       o1.id = elem.id;
       o.texts[o.texts.length] = o1;

       o.followers+=elem.user.followers_count;
       return;
      }
   }

  o = new Object();
  o.link = link;
  o.texts = new Array();
  o.followers = elem.user.followers_count;

  o1 = new Object();
  o1.text = elem.text;
  o1.id = elem.id;
  o.texts[0] = o1; 

  o.authors = new Array(); 
  o.authors[0] = elem.user;  

  links[links.length] = o;
}

function getLink(s)
{
 var i = s.indexOf("http://");
 var ans = s.substring(i);

 i = ans.indexOf(" ");
 if (i>0)
   ans = ans.substring(0,i);

 if (ans.indexOf(")")==ans.length-1)
  ans = ans.substring(0,ans.length-1);

 return ans;
}

function sortLinks(links)
{
  var was = true;

  while (was)
  {
    was = false;

    for (var i=0; i<links.length-1; i++)
    {
     var o = links[i];
     var o1 = links[i+1];

     if (o.authors.length < o1.authors.length)
     {
       was = true;
       var t = o;
       links[i] = o1;
       links[i+1] = t;
     }
     else
     {
       if (o.authors.length == o1.authors.length)
        if (o.followers < o1.followers)
        {
         was = true;
         var t = o;
         links[i] = o1;
         links[i+1] = t;
        }
     }
    }
  }

}

 function noteOk(txt)
 {
   if (txt.indexOf("http://4sq.com")>=0) return false;
   if (txt.indexOf("http://gowal.la")>=0) return false;

   return true;
  }


function TwitterProc(tml)
{
  if (tml.length>0)
  {
   var s = "<a href='http://twitter.com/";

   var i = lastUser.indexOf("/");
   var user = lastUser.substring(0,i);
   var list = lastUser.substring(i+1);

   s+=user+"/lists/"+list+"' target='_blank' title='@"+lastUser+"'>"
     +"@"+lastUser
     +"</a><br/>&nbsp;<br/>";
              
   document.getElementById('face').innerHTML=s;

   s="";

   var links = new Array();
 
   for (var i=0; i<tml.length; i++)
   {
     var elem = tml[i];
     var txt = elem.text;

     if (i<MAX_CLOUD) 
       s+=txt+" "; 

     if (txt.indexOf('http://')>=0) 
      if (noteOk(txt))
       addLink(links,elem);
    } 

      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");
      s =  s.replace(re, ' ');
       
      re = new RegExp("[0-9]","g");
      s =  s.replace(re, ' ');

      re = new RegExp('["«»]','g');
      s =  s.replace(re, ' ');

      re = new RegExp('&lt;','g');
      s =  s.replace(re, ' ');

      re = new RegExp('&gt;','g');
      s =  s.replace(re, ' ');

      re = new RegExp('&quot;','g');
      s =  s.replace(re, ' ');

      s = SkipNoise(s);

      re = new RegExp("[-+>=~<():,@.\t'\"{}%!?\/\\\\]","g");
      s =  s.replace(re, ' ');
      
    var elems = s.split(" ");
    var cloud=[];
    var tag;
    var max = 0; 
    var res;
              
    for (var i=0; i<elems.length; i++)
    {     
      tag = elems[i].toLowerCase();
      if (tag.length>3 && !isStop(tag) && tag.indexOf("#")==0)
      {
        res = -1;

        for (var j=0; j<cloud.length; j++)
          if (cloud[j].el==tag)
           {
               res = j;
               j = cloud.length+1;               
           }


           if (res<0)
           {
             cloud[cloud.length] = { count: 1, el: tag };
             max = Math.max(1, max);
           }
           else 
           {
             cloud[res].count += 1;
             max = Math.max(cloud[res].count, max);
           }

       }
          
   }
      
    s='';    
    for (var i = 0; i < cloud.length; i++) {
      if (cloud[i].count>=2)
       //s+='<a class="link1" style="font-size:' + Math.ceil((cloud[i].count / max) * scale) + 'em" href="http://search.twitter.com/search?q='+cloud[i].el+'" target="_blank">' + cloud[i].el + '</a> &nbsp; ';
       s+="<a title='count:"+cloud[i].count+"' class='link1' style='font-size:" + Math.ceil((cloud[i].count / max) * scale) + "em' href='http://got.linkstore.ru?q="+encodeURIComponent(cloud[i].el)+"' target='_blank'>" + cloud[i].el + "</a> &nbsp; ";
      else
       s+="<span title='count:"+cloud[i].count+"' style='color:blue;font-size:" + Math.ceil((cloud[i].count / max) * scale) + "em'>" + cloud[i].el + "</span> &nbsp; ";
    }

    var ans = "<span style='font-size:150%'>Recent topics:</span><br/><br/><div id='words'> "+ s + "</div>";
       
    ans += "<br/><br/><span style='font-size:150%'>Top links:</span><br/>&nbsp;<br/>";

    sortLinks(links);

    for (var i=0; i<links.length && i<MAX_LINKS; i++)
    {
      var o = links[i];

      ans+="<div id='linklist"+i+"' class='note' style='border-bottom: 1px dotted black;'>";
      ans+=proceedText(o.texts[0].text)+"<br/>"; 
      ans+="<small><b>posted by:</b> ";
      for (var j=0; j<o.authors.length; j++)
      {        
         ans+="<a class='retweet' href='http://tinfo.linkstore.ru?u="+o.authors[j].screen_name+"' target=_blank'>"+o.authors[j].screen_name+"</a>";
         if (j!=o.authors.length-1) ans+=", "; 
      }
      ans+="</small>";
      ans+="<br/>";
      ans+="<a class='retweet' href='http://twitter.com/home?status=@"+o.authors[0].screen_name+"&in_reply_to_status_id="+o.texts[0].id+"&in_reply_to="+o.authors[0].screen_name+"' title='reply'>reply</a>";
      ans+="&nbsp; ";
      ans+="<a class='retweet' href='http://twitter.com?status=RT%20%40"+o.authors[0].screen_name+"%20"+encodeURIComponent(o.texts[0].text)+"' title='retweet this'>retweet</a>";
      ans+="</div>";
    }
    
    ans+="<div class='share'>";

    ans += "<a class='link1' href='/tlist/index.jsp?u="+encodeURIComponent(lastUser)+"'>Refresh</a> &nbsp; "
         + "<a class='link1' href='http://twitter.com/home?status="+encodeURIComponent("list explorer by @t411: http://tlist.linkstore.ru?u="+lastUser)+"'>Twit this</a> &nbsp; "
         + "<a class='link1' href='/tlist/index.jsp'>More ?</a> ";

    ans += " &nbsp; &nbsp; "
    ans +="<iframe src='http://www.facebook.com/plugins/like.php?href="+encodeURIComponent(location.href)+"&amp;layout=button_count&amp;show_faces=false&amp;width=90&amp;action=like&amp;colorscheme=light&amp;height=21' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:90px; height:21px;' allowTransparency='true'></iframe>";

    ans+="</div>";
     
    document.getElementById('cloud').innerHTML = ans;
  }

  document.getElementById('result').innerHTML = "";
}

function SkipNoise(s0)
{
 var re = new RegExp('this','g');
 var s =  s0.replace(re, ' ');

 re = new RegExp('that','g');
 s =  s.replace(re, ' ');

 re = new RegExp('just','g');
 s =  s.replace(re, ' ');

 re = new RegExp('from','g');
 s =  s.replace(re, ' ');

 re = new RegExp('than','g');
 s =  s.replace(re, ' ');

 re = new RegExp('have','g');
 s =  s.replace(re, ' ');

 return s;

}

function addReply(ara, r, rId, sId)
{
  for (var i=0; i<ara.length; i++)
   if (ara[i].r==r) return;
 
  var rr = new Object();
  rr.r = r;

  if (rId)
    rr.id=sId;
  
  ara[ara.length]=rr;
  
}

function getTwitterFace(_user)
{
  lastLat='';
  lastLng='';
  lastUser = _user;

  var i = _user.indexOf("/");

  var user = _user.substring(0,i);
  var list = _user.substring(i+1);  

  var cbscript = document.createElement("script");
  //cbscript.src = "http://twitter.com/"+user+"/lists/"+list+"/statuses.json?callback=TwitterProc&per_page="+MAX_COUNT;
  cbscript.src="https://api.twitter.com/1/lists/statuses.json?callback=TwitterProc&per_page="+MAX_COUNT+"&owner_screen_name="+user+"&slug="+encodeURIComponent(list);
  cbscript.type = 'text/javascript';

//alert(cbscript.src);

  document.body.appendChild(cbscript);
}

    function proceedUrl(text)
    {
        var tweet = text;
        var re = new RegExp("(([a-zA-Z]+:\/\/)([a-zA-Z0-9][a-zA-Z0-9_\.-]*[a-zA-Z]{2,6})([a-zA-Z0-9~\#\/\._\?\&%-=]*[a-zA-Z0-9~\#\/_\?\&%-=]))", "g");
        tweet = tweet.replace(re, '<a class="link" target="_new" href=$1 >$1</a>');

        re = new RegExp("@([a-zA-Z0-9_]+)", "g");
	tweet = tweet.replace(re, '<a class="link" target="_new" href=http://tinfo.linkstore.ru?u=$1>@$1</a>');

        re = new RegExp("#([a-zA-Z0-9_]+)", "g");
	tweet = tweet.replace(re, '<a class="link" target="_new" href=http://search.twitter.com/search?q=%23$1>#$1</a>');


        tweet = tweet.replace(/&/g, '&');

        return tweet; 
    }

    function proceedPics(text)
    {
        var tweet = text;
     
        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 = '<a style="padding-bottom:7px" href="http://twitpic.com/' + m[2] + '" target="_blank"><img src="http://twitpic.com/show/thumb/' + m[2] + '" border="0" style="height:150;width:150;"></a><br/>';}	

        re = new RegExp("(http://yfrog.com/)([0-9a-zA-Z]*)");
	var m = re.exec(tweet);
	if  (!m || m.length == 0) {} 
	else {tweet = '<a style="padding-bottom:7px" 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><br/>';}	

        re = new RegExp("(http://img.ly/)([0-9a-zA-Z]*)");
     	m = re.exec(tweet);
  	if  (!m || m.length == 0) {} 
 	else {tweet = '<a style="padding-bottom:7px" href="http://img.ly/' + m[2] + '" target="_blank"><img src="http://img.ly/show/thumb/'+m[2]+'" border=0 height=150 width=150></a><br/>';}	

        re = new RegExp("(http://tweetphoto.com/)([0-9a-zA-Z]*)");
     	m = re.exec(tweet);
  	if  (!m || m.length == 0) {} 
 	else {tweet = '<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>';}	

        re = new RegExp("(http://plixi.com/p/)([0-9a-zA-Z]*)");
     	m = re.exec(tweet);
  	if  (!m || m.length == 0) {} 
 	else {tweet = '<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>';}	
        
      return tweet;
    }

   function proceedText(s)
   {
      var sText = '';
      var sPic = proceedPics(s);

      if (sPic!=s) 
      {
        sText+=sPic; 
      }
              
      sText +=proceedUrl(s);

      return sText;
   }

    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;
   }










