  cb_cnt = 0;
  status_re = new RegExp('<a href="(http://blip.pl/s/(\\d+))">[^<]+</a>','g');
  rdir_re = new RegExp('<a href="(http://rdir.pl/([^"]+))">[^<]+</a>','g');
  user_re = /\^([a-zA-Z\d]+)/g
  tag_re = /#([a-zA-Z\d]+)/g
  link_re = /(http:\/\/[a-zA-Z\d\.\-_\/]+)/g

  function call_blip(url,func,limit) {
    var cbname = 'callback_'+(cb_cnt++);
    if(!limit) limit=10;
    window[cbname] = func;
    var s=document.createElement('script');
    s.src=url+'.json?limit='+limit+'&callback='+cbname;
    document.body.appendChild(s);
  }

  function attr_replace(str) {
    return str.replace('"','\'').replace('&','&amp;').replace('>','&gt;').replace('<','&lt;');
  }

  blipCallback = function(blip){
    $('#blip').empty();
    $(blip).each(function(k,b){
      li = document.createElement('li');	
      var span = createTag('span',b.body,'blipBody');
      span.innerHTML = span.innerHTML.replace(link_re,'<a href="$1">$1</a>').replace(user_re,'<a href="http://$1.blip.pl">^$1</a>').replace(tag_re,'<a href="http://blip.pl/tags/$1">#$1</a>')
      li.appendChild(span);
      li.appendChild(createTag('span',b.created_at, 'blipDate'));
      var res;
      while((res=status_re.exec(span.innerHTML))) {
        function callback(s,span) {
	  return function(x) {
	    var status_re = new RegExp('<a href="(http://blip.pl/s/'+s+')">[^<]+</a>','g');
            span.innerHTML = span.innerHTML.replace(status_re, '<a href="$1" title="'+x.user_path.substring(7)+': '+attr_replace(x.body)+'">[blip]</a>');
          }
        }
        call_blip('http://api.blip.pl/statuses/'+res[2],callback(res[2],span));
      }
      while((res = rdir_re.exec(span.innerHTML))) {
        function callback(s,span) {
        	return function(x) {
            var rdir_re = new RegExp('<a href="(http://rdir.pl/'+s+')">[^<]+</a>','g');
            span.innerHTML = span.innerHTML.replace(rdir_re, '<a href="$1" title="'+attr_replace(x.original_link)+'">[link]</a>');
        	}
        }
        call_blip('http://api.blip.pl/shortlinks/'+res[2],callback(res[2],span));
      }
      $("#blip").append(li);
    });
  }
  createTag=function(name, content, className,id){
	  tag=document.createElement(name);
	  if(content)
		  tag.innerHTML=content;
	  if(className)
		  tag.className=className;
	  if(id)
		  tag.id=id;
	  return tag;
  }
  
  $(document).ready(function(){
	  call_blip('http://api.blip.pl/users/mrk/statuses',blipCallback,10);
  });

