$(document).ready(function(){

  var  s = {
 	  twitter_url: "twitter.com",               // [string]   custom twitter url, if any (apigee, etc.)
      twitter_api_url: "api.twitter.com",       // [string]   custom twitter api url, if any (apigee, etc.)
      twitter_search_url: "search.twitter.com"  // [string]   custom twitter search url, if any (apigee, etc.)
     }
	 
$.fn.extend({
    
     linkUrl: function() {
        var returning = [];
        // See http://daringfireball.net/2010/07/improved_regex_for_matching_urls
        var regexp = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi;
        this.each(function() {
          returning.push(this.replace(regexp,
                                      function(match) {
                                        var url = (/^[a-z]+:/i).test(match) ? match : "http://"+match;
                                        return "<a href=\""+url+"\">"+match+"</a>";
                                      }));
        });
        return $(returning);
      },
      linkUser: function() {
        var returning = [];
        var regexp = /[\@]+([A-Za-z0-9-_]+)/gi;
        this.each(function() {
          returning.push(this.replace(regexp,"<a href=\"http://"+s.twitter_url+"/$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 href="http://'+s.twitter_search_url+'/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);
      }
    });

});

var FMC_tweet = {
	
	container:'.twitter',
	n_tweets:25, //Number of tweets called
	n_tw_show:2, // Number of tweets shown
	timer_id:'',
	freq:5000,
	
	
	
	//INIT FUNC
	init:function(tags,freq,n_display,selector){
	
		var that = this;
		that.n_tw_show = n_display;
		that.freq = freq;
		that.api_call(tags);
		that.container = selector;
 
	},
	//API CALL FUNC
	api_call:function(queries){

	var that = this;
	var serialize = function (){
	
	var args = '';
					
	
	
	$.each(queries,function(i,query){
						 
						 if(typeof query === 'string'){
							 
							 if(i>0){
							 args+= "+OR+"	 
							 }
							 
							 query = query.toLowerCase();
							 query = query.replace(/^#/,'');
							 query  = $.trim(query);
							 
							 args+= "%23"+query;
							 
						 }
				   })//End each Func	
				
			 return args;
			}//End of serialize
	
	
	//'http://search.twitter.com/search.atom?q=%23haiku',
	var twitter_api = 'http://search.twitter.com/';
	var method = 'search';
	var format = 'json';
	var args = {
		          q:serialize(),
				  rpp:that.n_tweets,
				  callback:'?'
				 }  
	
	var url = twitter_api+method+'.'+format+'?'+decodeURIComponent($.param(args));;
	//JSON CALL
	$.getJSON(url,function(data){
						   
		var results = data.results;				   
		
		that.display(results);
		
    });//End of JSON
	
	},//End of api_call Func
	
  display:function(results){
  
  var that = this;
  
   $(that.container).empty();
  
  var tw_ul = $("<ul></ul>").appendTo(that.container);
  
  
  $.each(results,function(i, tweet){
	
	var tweet_msg = $([tweet.text]).linkUrl().linkUser().linkHash().makeHeart().capAwesome().capEpic()[0]
	var date = that.relative_time(tweet.created_at);
	var f_user = tweet.from_user;
	var avatar = tweet.profile_image_url;
	

	var tw_html = "<div class='avatar tw_avatar'><img src="+avatar+"></div><div class='tweet'>"; //Avatar
		tw_html	+="<p><strong><span class='blue tw_user'>"+f_user+": </span></strong>"; //User id
		tw_html += tweet_msg; //message
		tw_html += "<br><span class='timestamp'>"+date+"</span></p></div>"; //timestamp
	
	var tw_list = $('<li></li>')
	
		tw_list.html(tw_html).appendTo(tw_ul);;
		
		if(i == (that.n_tw_show - 1) ){
		
		tw_list.css('border','none');
			
		}
		
		
		if(i > (that.n_tw_show - 1) ){
			
		//tw_list.css('display','none');
		tw_list.hide();
		}


     });//End of each
  
   
   var coursel_timer = function(){//Proxy function
			that.carousel_effect();
		}
  
   var fade_out_timer = function(){//Proxy function
			that.fade_out_effect();
		}
  
	
	if(that.n_tw_show === 1){
	   
	that.timer_id = setInterval(fade_out_timer,that.freq);
	
	}else{
	   
	that.timer_id = setInterval(coursel_timer,that.freq);   
	}
	
  
   
  }, //End of Display
 

//FADE OUT EFFECT
	fade_out_effect:function(){
	 var that = this;
	 var tw_ul = $(that.container+' ul');	
    
	 tw_ul.find('li:first').fadeOut(function(){
		
     $(this).appendTo(tw_ul);
	 
	 $.each(tw_ul.find('li'),function(i,li){
			
			 if(i==0){
				 
				 $(li).show();
			 }
			});//End of Each
       });//End of Callback

	}, //END OF FADE OUT FUNC

//CAROUSEL EFFECT  
  carousel_effect:function(){
	  
	   var that = this;
	  var tw_ul = $(that.container);
  
	  tw_ul.find('li:first').slideUp(function(){
		 
		 $(this)
		 .appendTo(tw_ul);
		 
		 $.each(tw_ul.find('li'),function(i,li){
			
			 if(i<= (that.n_tw_show - 1)){
				 
				 $(li)
				 .css('border-bottom','1px solid #595959')
				 .show();
				 
				 if (i == (that.n_tw_show - 1)){
					 
					 $(li).css('border','none');
					 
					 }
				 
				 }
			
			
			});
											  
	  });
	  
  },
  
  create:function(){
	
	return  $.extend({},this);
	  
  },
  parse_date:function (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'));
  },
  relative_time: function (time_value) {
      var parsed_date = this.parse_date(time_value);
      var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
      var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
      var r = '';
      if (delta < 60) {
	r = delta + ' seconds ago';
      } else if(delta < 120) {
	r = 'a minute ago';
      } else if(delta < (45*60)) {
	r = (parseInt(delta / 60, 10)).toString() + ' minutes ago';
      } else if(delta < (2*60*60)) {
	r = 'an hour ago';
      } else if(delta < (24*60*60)) {
	r = '' + (parseInt(delta / 3600, 10)).toString() + ' hours ago';
      } else if(delta < (48*60*60)) {
	r = 'a day ago';
      } else {
	r = (parseInt(delta / 86400, 10)).toString() + ' days ago';
      }
      return 'about ' + r;
    }

}


