
 var s = "";

 var lastUser='';
 var lastFriends = 0;
 var lastPage = 1;
 var fetched = [];

 var MAX_LEN=40;
 var MAX_PAGES = 15; // how many pages
 var PAGE_SIZE = 30; // timelines per page
 var MAX_COUNT = 20; // how many twits

 var IDS = [];
 var TWITS=[];
 var currentFriend = 0;
 var absCount = 0;

 var urlRegex = new RegExp("([^:]*):[/]*(?:www\.)*([^/]+)([^\?]*)(.*)");
 var spaceRegex =new RegExp("[ \t\n\r+]+","g");
 var scale=2; 

 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 noteOk(txt)
 {
   if (txt.indexOf("http://4sq.com")>=0) return false;
   if (txt.indexOf("http://twitter.com/#")>=0) return false;
   if (txt.indexOf("http://gowal.la")>=0) return false;

   return true;
  }

 function showNote(note)
 {
    var s = "";

    s+="<div class='note' id='n"+note.guid+"'><span class='author'><a class='author-link' href='http://tinfo.linkstore.ru?u="+note.name+"' target='_blank'>"+note.title+"</a></span><br/>";
    s+=proceedText(note.description, 'l'+note.guid);
    s+="<div class='expl' id='l"+note.guid+"'></div>";
    s+="<div class='rtblock'>"
      +"<a class='rtlink' href=\"http://twitter.com?status="+getRetweet(note)+"\" target=\"_blank\">Retweet</a>"
      +" "
      +"<a class='rtlink' href=\"http://twitter.com?status="+getReply(note)+"\" target=\"_blank\">Reply</a>"
      +" "
      +"<a class='rtlink' href=\"http://got.linkstore.ru?q="+searchQuery(note.description)+"\" target=\"_blank\">Search</a>";

    if (note.description.indexOf("@")==0)
      s+="&nbsp; "+"<a class='rtlink' href='http://tdialog.linkstore.ru?"+note.guid+"' target='_blank' title='Conversation'><img alt='' border='0' src='/tlink/thread.png'/></a>"; 

    s+="</div>";
    s+="</div>";

    return s;
 }

 function getNotesFromList(list)
 {
  var s='';
  var foundnodes = list["value"];

  if (foundnodes)
  {
   foundnodes = foundnodes.items; 
   if (foundnodes)
   {
    for (var node in foundnodes) 
    {
      var info = foundnodes[node];      
      var desc = info.description;
      if (desc) 
       if (desc.indexOf("http://")>=0)
       {
        if (noteOk(desc))
           s+=showNote(info);
       }  
    }
   } 
  }

  return s;

 }

 function getShare()
 {
  var this_link = "http://tlink.linkstore.ru?u="+lastUser;

  var twit_link="Links from @"+lastUser+" "+this_link;
     
  var subjectLine='Links from @'+lastUser; 
  var bodyText='See: '+this_link;

  var message_link = 'mailto:?subject='+escape(subjectLine)+'&body='+escape(bodyText);
     
  var face_link = 'http://www.facebook.com/sharer.php?u='+this_link+'&t='+encodeURIComponent(subjectLine);
             
  var s="<div class='link1'>Share: "
        +"<a href='http://twitter.com/home?status="+escape(twit_link)+"' target='_blank'>twit this</a> | "
        +"<a href='"+face_link+"' title='Share via facebook' target='_blank'>facebook</a> | "
        +"<a href='"+message_link+"' title='Share via email' target='_blank'>email</a> "
        +"&nbsp;&nbsp; "
        +"<a href='/tlink/index.jsp'>New links</a>"
        +" &nbsp; "
        +"<iframe src='http://www.facebook.com/plugins/like.php?href="+encodeURIComponent(this_link)+"&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>"
        +"</div>";

  return s;

 }

 function getPages()
 {
   var s = "<div class='link1' style='padding-top:10px'>Pages: ";

   var i = 1;
   var count = 0;

   while (count < lastFriends && i <= MAX_PAGES)
   {
     if (i==lastPage)
      s+=i+" ";
     else
      s+="<a href='javascript:void(0)' onClick='gotoPage("+i+");' title='Page "+i+"'>"+i+"</a> ";
     count+=PAGE_SIZE;
     i++;  
   }

   s+=" &nbsp; <span id='pageIndicator' style='display:none'><img src='/tlink/load1.gif' alt='' border=''></span>";

   s+="</div>";

   return s;
        
 }

 function wrapResults(s0)
 {
   var s = s0;
  
   if (s == '') s="<br/><span style='font-size:130%;color:red'>no data (yet?) ...</span>";

   var ans = "<br/><span style='font-size:150%'>Links:<br/></span><span> &nbsp; "           
           + s
           + "<br/>&nbsp;";

   return ans;
 }

 function gotoPage(n)
 {
   var o = document.getElementById('pageIndicator');
   o.style.display='inline';

   lastPage = n;

   TWITS = [];
   currentFriend = (n-1)*PAGE_SIZE;
   absCount = 0;
   

   collectData(currentFriend);
   
 }
  

function getMap(lat,lng)
{
  var s = "<a href='http://bigmap.linkstore.ru?lat="+lat
        + "&lng="+lng
        + "&zml=10"
        + "&mrk=1"         
        + "' target='_blank'>"
        + lat+","+lng
        +"</a>";

  return s;
}

function fillIds(t)
{
  if (!t) 
  {
    alert("Could not get friends data from Twitter. Rate limit exceeded?");
    return;
  }

  if (t.length==0)
  {
    alert("Could not get friends data from Twitter. Rate limit exceeded?");
    return;
  }

  if (t.ids.length==0)
  {
    alert("Could not get friends data from Twitter");
    return;
  }

  IDS=[];
  
  for (var i=0; i<=t.ids.length; i++)
  {
    IDS[i] = t.ids[i];
  }

  TWITS = [];
  currentFriend = 0;
  absCount = 0;

  collectData(0);

}

function collectData(pos)
{

//alert(pos+":"+IDS[pos]);

  currentFriend = pos;
  if (absCount>=PAGE_SIZE-1 || pos>=IDS.length || !IDS[pos]) showData(); 
  else
    getScript("http://api.twitter.com/1/statuses/user_timeline.json?user_id="+IDS[pos]+"&count="+MAX_COUNT+"&include_entities=true&callback=getTimeLine"); 
}

function getTimeLine(t)
{
//alert(dump(t));
  absCount++;
  TWITS[TWITS.length]=t;
  collectData(currentFriend+1); 
}

function showData()
{
  var res = "";
  for (var i=0; i<TWITS.length; i++)
  {
    var tl = TWITS[i];

//if (i==0) alert(dump(tl));

    for (var j=0; j<tl.length; j++)
    {
      var tvt = tl[j];

//if (tvt.text.indexOf("http://t.co")>=0) alert(dump(tvt));

      if (tvt.text.indexOf("http://")>=0)
       if (noteOk(tvt.text))
       {

        var txt = tvt.text;
        var vv=tvt.entities.urls;
        if (vv)
         if (vv.length>0)
          {
            for (var k=0; k<vv.length; k++)
            {
              var u = vv[k];
              if (u.display_url)
               txt = txt.replace(u.url,u.expanded_url);
             }
           } 

        var retweet = "RT @"+tvt.user.screen_name+" "+txt;
        
        res+="<div class='note'>"
            +"<a style='text-decoration:none' href='http://tinfo.linkstore.ru?u="+tvt.user.screen_name+"' target='_blank'><img src='"+tvt.user.profile_image_url+"' style='float:left;border:0;padding-right:7px;padding-bottom:7px;width:48px;height:48px'/></a>" 
            +proceedText(txt)
            +"<div class='rtblock'>"
            +"<a class='rtlink' href='http://twitter.com?status="+encodeURIComponent(retweet)+"' target='_blank'>Retweet</a>";

        if (tvt.retweet_count) res+=" ("+tvt.retweet_count+")";

        res+=" &nbsp;"
            +"<a class='rtlink' href='http://twitter.com?status=@"+tvt.user.screen_name+"&in_reply_to="+tvt.user.screen_name+"&in_reply_to_status_id="+tvt.id_str+"' target='_blank'>Reply</a>"
            +" &nbsp;"
            +"<a class='rtlink' href='http://got.linkstore.ru?q="+encodeURIComponent(clearText(txt))+"' target='_blank'>Search</a>";

        if (tvt.in_reply_to_status_id_str)
                 res+="&nbsp; "+"<a class='rtlink' href='http://tdialog.linkstore.ru?"+tvt.in_reply_to_status_id_str+"' target='_blank' title='Conversation'><img alt='' border='0' src='/tlink/thread.png'/></a>"; 

        if (tvt.geo)
          if (tvt.geo.coordinates)
            res+=" &nbsp; <a class='rtlink' href='http://bigmap.linkstore.ru?mrk=1&lat="+tvt.geo.coordinates[0]+"&lng="+tvt.geo.coordinates[1]+"' target='_blank'>Map</a>";

        res+="&nbsp; <span class='rtlink'>"+tvt.created_at+"</span>";

        res+="</div>";
        res+="</div>";
       }
    }
  }
  
  res+=getPages();

  var s1 = getShare();

  document.getElementById('result').innerHTML = wrapResults(res);

  document.getElementById('more').innerHTML = s1+"<br/>&nbsp;";

}

function TwitterLoc(t)
{

  if (!t) 
  {
    alert("Could not get data from Twitter");
    return;
  }

  lastFriends = t.friends_count;

  getScript("http://api.twitter.com/1/friends/ids/"+lastUser+".json?cursor=-1&callback=fillIds")
 
  var image = t.profile_image_url;
  var o = document.getElementById("location");
  var name = t.screen_name;

  var s ="<a style='text-decoration:none' href='http://tinfo.linkstore.ru?u="+name+"' target='_blank'><img src='"+image+"' border='0' alt='"+t.name+"'/></a><br/>&nbsp;<br/>";

  document.getElementById('face').innerHTML=s;
 
  var loc = t.location;
  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>";
  }

  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 clearText(text)
{
  var tweet = text;

  tweet = tweet.replace(/</g, '&lt;');

  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, ' ');

  return tweet;
}

function proceedText(text)
    {
        var tweet = text;

        tweet = tweet.replace(/</g, '&lt;');

        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="_blank" href=$1 >$1</a>');

        re = new RegExp("@([a-zA-Z0-9_]+)", "g");
	tweet = tweet.replace(re, '@<a style="' + 'text-decoration:none;" target="_blank" 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;" target="_blank" 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/>' + '<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>';}	

         re = new RegExp("(http://yfrog.com/)([0-9a-zA-Z]*)");
	 m = re.exec(tweet);
 	 if  (!m || m.length == 0) {} 
	 else {tweet += '<br/><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>';}	

         re = new RegExp("(http://img.ly/)([0-9a-zA-Z]*)");
      	 m = re.exec(tweet);
  	 if  (!m || m.length == 0) {} 
 	 else {tweet += '<br/><a  href="http://img.ly/' + m[2] + '"><img src="http://img.ly/show/thumb/'+m[2]+'" border="0" style="height:150;width:150;"></a>';}	

        re = new RegExp("(http://tweetphoto.com/)([0-9a-zA-Z]*)");
     	m = re.exec(tweet);
  	if  (!m || m.length == 0) {} 
 	else {tweet += '<br/><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 += '<br/><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>';}	        

        re = new RegExp("(http://lockerz.com/s/)([0-9a-zA-Z]*)");
     	m = re.exec(tweet);
  	if  (!m || m.length == 0) {} 
 	else {tweet += '<br/><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>';}	        

        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/><a  href="'+m[0]+'" target="_blank"><img src="'+m[0]+ '" border=0 height=150 width=150></a>'; return tweet;}	        

        re = new RegExp("(http://twitrpix.com/)([0-9a-zA-Z]*)");
	m = re.exec(tweet);
	if  (!m || m.length == 0) {} 
	else {tweet += '<br/><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>'; return tweet;}	

        re = new RegExp("(http://moby.to/)([0-9a-zA-Z]*)");
	m = re.exec(tweet);
	if  (!m || m.length == 0) {} 
	else {tweet += '<br/><a  href="http://moby.to/' + m[2] + '" target="_blank"><img src="http://moby.to/' + m[2] + ':medium" border=0 height=150 width=150></a>'; return tweet;}	

        re = new RegExp("(http://twitsnaps.com/)([0-9a-zA-Z]*)");
	m = re.exec(tweet);
	if  (!m || m.length == 0) {} 
	else {tweet += '<br/><a  href="http://twitsnaps.com/' + m[2] + '" target="_blank"><img src="http://twitsnaps.com/thumb/' + m[2] + '" border=0 height=150 width=150></a>'; return tweet;}	

        re = new RegExp("(http://twitgoo.com/)([0-9a-zA-Z]*)");
	m = re.exec(tweet);
	if  (!m || m.length == 0) {} 
	else {tweet += '<br/><a  href="http://twitgoo.com/' + m[2] + '" target="_blank"><img src="http://twitgoo.com/' + m[2] + '/thumb" border=0 height=150 width=150></a>'; 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/><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>'; return tweet;}	

        
      return tweet;
    }


function addReply(ara, r)
{
  for (var i=0; i<ara.length; i++)
   if (ara[i]==r) return;

  ara[ara.length]=r;
}

function getLocation(user)
{
  getScript('http://twitter.com/users/show/'+user+'.json?callback=TwitterLoc');
}

function getScript(s)
{
  var cbscript = document.createElement("script");
  cbscript.src = s;
  cbscript.type = 'text/javascript';
  document.body.appendChild(cbscript);
}

function searchQuery(s)
{
  var ans=s;

  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");
  ans = ans.replace(re, '');

  re = new RegExp("@([a-zA-Z0-9_]+)", "g");
  ans = ans.replace(re, '');

  re = new RegExp("([,:!\.\?\(\)\=\;\-])", "g");
  ans = ans.replace(re,' ');

  re = new RegExp("RT ", "g");
  ans = ans.replace(re,'');

  return encodeURIComponent(trim(ans));
}


function expandBitly()
{
  var links = document.getElementsByTagName('a');
  for (var i=0; i < links.length; i++) 
   {
	var a = links[i];
	if (a.href && a.href.match(/^http\:\/\/bit\.ly/)) 
        {
	 if (!fetched[a.href]) 
         {
	  BitlyAPI(a.href);	
          return; 
      	 }
         else
         {

          var title = fetched[a.href].title;
          var longUrl = fetched[a.href].longUrl;
          var ids = fetched[a.href].ids;
          var id = a.getAttribute('id1');

          if (title!='' || longUrl!='')
            if (!ids[id])
            {  
              addLinks(id,title,longUrl)	
              ids[id]="1"; 
            }
          }
        }
  }

  finishBitLy();
}

function finishBitLy()
{
  var o = document.getElementById("gindicator");
  o.style.display = "none";
}

function BitlyAPI(s)
{
 var o = document.getElementById('pageIndicator');
 var doIt = true;
 
 if (o) 
  if (o.style.display!='none') doIt=false;

 if (doIt)
 {
  getScript('http://api.bit.ly/info?version=2.0.1&shortUrl='+s
            + '&keys=htmlTitle,longUrl&login=coldjava&apiKey=R_eaef9593ff7dafb595bf584116f7a108'
            + '&callback=myInfoCallback');
 }
}


var count=1;
function myInfoCallback(data)
{
			// this is how to get a result of infoing a single url
			var results = data.results;
						
			var links = document.getElementsByTagName('a');
			for (var i=0; i < links.length; i++) 
                        {
			    var a = links[i];
   			    if (a.href && a.href.match(/^http\:\/\/bit\.ly/) && !fetched[a.href]) 
                            {
                              var k = a.href.lastIndexOf("/");
                              var hash = a.href.substring(k+1);

 			       var r = results[hash];

                               var link = { };
                               link.title = '';
                               link.longUrl=''; 
                               link.ids=[];

      			       if (r) {
				 var title = rtrim(ltrim(r['htmlTitle']));
                                 var longUrl = r['longUrl'];

                                 var id = a.getAttribute('id1');	

                                 addLinks(id,title,longUrl)	
                                
                                 link.title = title;
                                 link.longUrl=longUrl; 
                                 link.ids[id]="1";

                                 fetched[a.href]=link; 
                             
 				    }

                                 else
                                   fetched[a.href] = link; 

                               
                               expandBitly();

                               return;
			    }
				
			}
			
}

function getLongLink(s)
{
 var ans = "<a class='expl1' href='"+s+"' target='_blank'>";

 if (s.length>MAX_LEN) 
  ans+=s.substring(0,MAX_LEN)+"...";
 else
  ans+=s;

 ans+="</a>";

 return ans;
}

function addLinks(id,title,longUrl)	
{
   var o = document.getElementById(id);
   var o1 = document.getElementById('n'+id.substring(1));

   var old = o.innerHTML;
   var old1 = o1.innerHTML;

   if (old) old+="<br/>";
   else     old="";

   var s ="";

//if (title.indexOf("Time")>=0)
//alert("id:"+id+" "+o1+" old1:"+old1+" title:"+title+" "+old1.indexOf(title));

   if (title)
    if (old1.indexOf(title)<0)    
     s += "<em>"+ title +"</em>" + "<br/>";

   s+=getLongLink(longUrl);
                
   o.innerHTML = old+s; 
}

function ltrim(s)
{
  if (!s) return "";

  var ans = s;

  while (ans.length>0)
  {
    if (' '==ans.substring(0,1))
      ans = ans.substring(1);
    else
      return ans;
  }

  return ans;
}

function rtrim(s)
{
  if (!s) return "";

  var ans = s;

  while (ans.length>0)
  {
    if (' '==ans.substring(ans.length-1,1))
      ans = ans.substring(0,ans.length-1);
    else
      return ans;
  }

  return ans;

}

function trim(s)
{
  return ltrim(rtrim(s));
}

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;
}

