(function($) {
 
  $.fn.tweet = function(o){
    var s = {
      username: null,              // [string]   required, unless you want to display our tweets. :) it can be an array, just do ["username1","username2","etc"]
      list: null,                              //[string]   optional name of list belonging to username
      avatar_size: null,                      // [integer]  height and width of avatar if displayed (48px max)
      count: 3,                               // [integer]  how many tweets to display?
      intro_text: null,                       // [string]   do you want text BEFORE your your tweets?
      outro_text: null,                       // [string]   do you want text AFTER your tweets?
      join_text:  null,                       // [string]   optional text in between date and tweet, try setting to "auto"
      auto_join_text_default: "",      // [string]   auto text for non verb: "i said" bullocks
      auto_join_text_ed: "",                 // [string]   auto text for past tense: "i" surfed
      auto_join_text_ing: "",             // [string]   auto tense for present tense: "i was" surfing
      auto_join_text_reply: "",   // [string]   auto tense for replies: "i replied to" @someone "with"
      auto_join_text_url: "", // [string]   auto tense for urls: "i was looking at" http:...
      loading_text: null,                     // [string]   optional loading text, displayed while tweets load
      query: null                             // [string]   optional search query
    };
    
    if(o) $.extend(s, o);
    
    $.fn.extend({
      linkUrl: function() {
        var returning = [];
        var regexp = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi;
        this.each(function() {
          returning.push(this.replace(regexp,"<a class=\"tweet_link\" href=\"$1\">$1</a>"));
        });
        return $(returning);
      },
      linkUser: function() {
        var returning = [];
        var regexp = /[\@]+([A-Za-z0-9-_]+)/gi;
        this.each(function() {
          returning.push(this.replace(regexp,"<a class=\"username tweet_link\" target=\"_blank\" href=\"http://twitter.com/$1\">@$1</a>"));
        });
        return $(returning);
      },
      linkHash: function() {
        var returning = [];
        var regexp = /(?:^| )[\#]+([A-Za-z0-9-_]+)/gi;
        this.each(function() {
          returning.push(this.replace(regexp, ' <a target="_blank" class=\"tweet_link\" href="http://search.twitter.com/search?q=&tag=$1&lang=all">#$1</a>'));
        });
        return $(returning);
      }, 
      capAwesome: function() {
        var returning = [];
        this.each(function() {
          returning.push(this.replace(/\b(awesome)\b/gi, '<span class="awesome">$1</span>'));
        });
        return $(returning);
      },
      capEpic: function() {
        var returning = [];
        this.each(function() {
          returning.push(this.replace(/\b(epic)\b/gi, '<span class="epic">$1</span>'));
        });
        return $(returning);
      },
      makeHeart: function() {
        var returning = [];
        this.each(function() {
          returning.push(this.replace(/(&lt;)+[3]/gi, "<tt class='heart'>&#x2665;</tt>"));
        });
        return $(returning);
      }
    });

    function parse_date(date_str) {
      // The non-search twitter APIs return inconsistently-formatted dates, which Date.parse
      // cannot handle in IE. We therefore perform the following transformation:
      // "Wed Apr 29 08:53:31 +0000 2009" => "Wed, Apr 29 2009 08:53:31 +0000"
      return Date.parse(date_str.replace(/^([a-z]{3})( [a-z]{3} \d\d?)(.*)( \d{4})$/i, '$1,$2$4$3'));
    }

    function relative_time(time_value) {
      var parsed_date = parse_date(time_value);
      var rawDate = new Date(parsed_date);
      mins = rawDate.getMinutes();
	  if(mins<10){
			mins = '0'+mins;
	  }
	  var m_names = new Array("Januari", "Februari", "Maart", 
				"April", "Mei", "Juni", "July", "Augustus", "September", 
				"Oktober", "November", "December");
	  hours = rawDate.getHours();
	  days = rawDate.getDay();
	  months = m_names[rawDate.getMonth()];
	  return hours +':'+ mins;
    }
    
    function build_url2() {
      var proto = ('https:' == document.location.protocol ? 'https:' : 'http:');
      if (s.list && s.username == null) {
    	  var query = '#'+s.list;
          return proto+'//search.twitter.com/search.json?&q='+escape(query)+'&rpp='+s.count+'&callback=?';
      } else if (s.list != null && s.username != null) {
    	  var query = 'from:'+s.username[0]+' #'+s.list;
          return proto+'//search.twitter.com/search.json?&q='+escape(query)+'&rpp='+s.count+'&callback=?';
      } else {
        var query = (s.query || 'from:'+s.username);
        return proto+'//search.twitter.com/search.json?&q='+escape(query)+'&rpp='+s.count+'&callback=?';
      }
    }
    
    function build_url() {
        var proto = ('https:' == document.location.protocol ? 'https:' : 'http:');
        if (s.list && s.username == null) {
      	  var query = '#'+s.list;
            return proto+'//search.twitter.com/search.json?&q='+escape(query)+'&rpp='+s.count+'&callback=?';
        } else if (s.list != null && s.username != null) {
      	  var query = 'from:'+s.username[0]+' #'+s.list;
            return proto+'//search.twitter.com/search.json?&q='+escape(query)+'&rpp='+s.count+'&callback=?';
        } else {
          return 'http://api.twitter.com/1/statuses/user_timeline.json?screen_name='+s.username+'&count='+s.count+"";
        }
      } 
    
    
    return this.each(function(i, widget){
    	var temp_array = new Array();
    	
    	$('<img class="logo_gadget" width="110" src="/images/twitter_logo_header.png>"').appendTo(widget);
    	var intro = '<p class="tweet_intro">'+s.intro_text+'</p>';
        var outro = '<p class="tweet_outro">'+s.outro_text+'</p>';
        var loading = $('<p class="loading">'+s.loading_text+'</p>');
        var list = $('<ul class="tweet_list">').appendTo(widget);
      if(typeof(s.username) == "string"){
        s.username = [s.username];
      }

      if (s.loading_text) $(widget).append(loading);
      
      fetch_twitter_data = function (){

      	 $.getJSON(build_url2(), parse_twitter_data);
      	
      }
      
      fetch_twitter_data();
      var empty = true;
 
      function parse_twitter_data (data){
    	 // console.log(data);
    	  $("#"+widget.id+" .tweet_list > li").remove();
    	  $("#"+widget.id+" .bekijk_twitter").remove();
    	  $("#"+widget.id+" .border_gadget").remove();
          if (s.loading_text) loading.remove(); 
          if (s.intro_text) list.before(intro);
          var tweets = (data.results || data);
         
          $.each(tweets, function(i,item){
            // auto join text based on verb tense and content
            if (s.join_text == "auto") {
              if (item.text.match(/^(@([A-Za-z0-9-_]+)) .*/i)) {
                var join_text = s.auto_join_text_reply;
              } else if (item.text.match(/(^\w+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+) .*/i)) {
                var join_text = s.auto_join_text_url;
              } else if (item.text.match(/^((\w+ed)|just) .*/im)) {
                var join_text = s.auto_join_text_ed;
              } else if (item.text.match(/^(\w*ing) .*/i)) {
                var join_text = s.auto_join_text_ing;
              } else {
                var join_text = s.auto_join_text_default;
              }
            } else {
              var join_text = s.join_text;
            };

            var from_user = item.from_user || item.user.screen_name;
            var profile_image_url = item.profile_image_url || item.user.profile_image_url;
            var join_template = '<span class="tweet_join"> '+join_text+' </span>';
            var join = ((s.join_text) ? join_template : ' ');
            var avatar_template = '';
            var avatar = (s.avatar_size ? avatar_template : '');
            var date = '<span class="tweet_time">Door: <a class="username tweet_link" href="http://twitter.com/'+from_user+'" title="Ga naar de twitter pagina van '+from_user+'">@'+from_user+'</a> om ' + relative_time(item.created_at) + '</span>';
            var text = '<span class="tweet_text">' +$([item.text]).linkUrl().linkUser().linkHash().makeHeart().capAwesome().capEpic()[0]+ '</span>';

            // until we create a template option, arrange the items below to alter a tweet's display.
            list.append('<li><div class="border_gadget"></div><div class="tekst_gadget">' + avatar + join + text + '<br /><span class="date_gadget">' + date + '</span></div></li>');

            list.children('li:first').addClass('tweet_first');
            list.children('li:odd').addClass('tweet_even');
            list.children('li:even').addClass('tweet_odd');
            empty = false;
          });

          if(empty==true)
          {
        	  if(Ext.get('widget-twitter')!=null)
        	  {
        		  widgets = Ext.get('widget-twitter').parent();
        	  	  widgets.remove();
        	  }
        	  if(Ext.get('tweet_1')!=null)
        	  {
        		  widgets2 = Ext.get('tweet_1').parent();
        		  widgets2.remove();
        	  }
        	  
          } else {
          list.append('<li"><div class="border_gadget"></div></li>');
          if (s.list != null && s.username == null) {
        	  var query = '#'+s.list;
              url= 'http://search.twitter.com/search?&q='+escape(query);
          } else if (s.list != null && s.username != null) {
        	  var query = 'from:'+s.username[0]+' #'+s.list;
        	  url= 'http://search.twitter.com/search?&q='+escape(query);
          } else {
            var query = (s.query || 'from:'+s.username.join(' OR from:'));
            	url= 'http://twitter.com/'+s.username;
          }
          i
          $('<a class="bekijk_twitter" target="_blank" href="'+url+'"><img src="/images/bekijk_twitter_btn.png"></a>').appendTo(widget);
          if (s.outro_text) list.after(outro);
          $(widget).trigger("loaded").trigger((tweets.length == 0 ? "empty" : "full"));
          
          var varWidget = Ext.get(widget.id);
          twttr.anywhere(function (T) {
        	    T("#"+widget.id+" a.username").hovercards({linkify: false});
        	  });

          onResize();
          setInterval("fetch_twitter_data();",15000);
         //varWidget.clearOpacity();
          }
         
        }
    });
    
  };
})(jQuery);