﻿(function(jQuery) {
/* ---------------------------------------------------------------------------------------------- */
	var doBlink = function(obj,start,finish) { jQuery(obj).fadeOut(300).fadeIn(300); if(start!=finish) { start=start+1; doBlink(obj,start,finish); } } 
	
	  jQuery.fn.tweet = function(o){
		var s = {
			username: ["test"], // [string]   required, unless you want to display our tweets. :) it can be an array, just do ["username1","username2","etc"]
			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: "i said,", // [string]   auto text for non verb: "i said" bullocks
			auto_join_text_ed: "i", // [string]   auto text for past tense: "i" surfed
			auto_join_text_ing: "i am", // [string]   auto tense for present tense: "i was" surfing
			auto_join_text_reply: "i replied to", // [string]   auto tense for replies: "i replied to" @someone "with"
			auto_join_text_url: "i was looking at", // [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
			tag: null,
			timer: 1 // toevoeging voor jquery.timer.js 
		};

		jQuery.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 href=\"$1\">$1</a>"))
				});
				return jQuery(returning);
			},
			
			linkUser: function(){
				var returning = [];
				var regexp = /[\@]+([A-Za-z0-9-_]+)/gi;
				this.each(function(){
					returning.push(this.replace(regexp, "<a href=\"http://twitter.com/$1\">@$1</a>"))
				});
				return jQuery(returning);
			},
			
			linkHash: function(){
				var returning = [];
				var regexp = / [\#]+([A-Za-z0-9-_]+) /gi;
				this.each(function(){
					returning.push(this.replace(regexp, ' <a href="http://search.twitter.com/search?q=&tag=$1&lang=all&from=' + s.username.join("%2BOR%2B") + '">#$1</a> '))
				});
				return jQuery(returning);
			},
			
			capAwesome: function(){
				var returning = [];
				this.each(function(){
					returning.push(this.replace(/(a|A)wesome/gi, 'AWESOME'))
				});
				return jQuery(returning);
			},
			
			capEpic: function(){
				var returning = [];
				this.each(function(){
					returning.push(this.replace(/(e|E)pic/gi, 'EPIC'))
				});
				return jQuery(returning);
			},
			
			makeHeart: function(){
				var returning = [];
				this.each(function(){
					returning.push(this.replace(/[&lt;]+[3]/gi, "<tt class='heart'>&#x2665;</tt>"))
				});
				return jQuery(returning);
			}
		});
		

		function relative_time(time_value){
			var parsed_date = Date.parse(time_value);
			var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
			var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
			if (delta < 60) {
				return 'minder dan 1 minuut geleden';
			}
			else 
				if (delta < 120) {
					return 'ongeveer 1 minuut geleden';
				}
				else 
					if (delta < (45 * 60)) {
						return (parseInt(delta / 60)).toString() + ' minuten geleden';
					}
					else 
						if (delta < (90 * 60)) {
							return 'ongeveer 1 uur geleden';
						}
						else 
							if (delta < (24 * 60 * 60)) {
								return 'ongeveer ' + (parseInt(delta / 3600)).toString() + ' uren geleden';
							}
							else 
								if (delta < (48 * 60 * 60)) {
									return '1 dag geleden';
								}
								else {
									return (parseInt(delta / 86400)).toString() + ' dagen geleden';
								}
		}

	 	function format_time(time_value){
			
			function zeropad( n ){ return n>9 ? n : '0'+n; }
			
			var t = new Date(time_value);
			var M = t.getMonth(); // maand-1
			var Y = t.getFullYear();
			var D = t.getDate();
			var d = t.getDay(); // 0..6 == zon..zat
			var day = ['zondag','maandag','dinsdag','woensdag','donderdag','vrijdag','zaterdag'][d];
  			var mon = ['januari','februari','maart','april','mei','juni',
             			'juli','augustus','september','oktober','november','december'][M];
  			var h = t.getHours();
  			var m = t.getMinutes();
  			var s = t.getSeconds();
  			return day +' '+ D +' '+ mon +', '+ Y +', '+
         			zeropad(h)+':'+zeropad(m)+':'+zeropad(s);
			
			
			/* Tijd omzetten naar GMT+2 */
			//time_value = time_value.toGMTString();
			
			/* Weekdag vertalen */
			/*var day = left(time_value, 3);
			
			switch (day){
				case "mon": day = "maandag"; break;
				case "tue": day = "dinsdag"; break;
				case "wed": day = "woensdag"; break;
				case "thu": day = "donderdag"; break;
				case "fri": day = "vrijdag"; break;
				case "sat": day = "zaterdag"; break;
				case "sun": day = "zondag"; break;
			}*/
			

		}

		function left(str, n) {
                if (n <= 0)     // Invalid bound, return blank string
                        return "";
                else if (n > String(str).length)   // Invalid bound, return
                        return str;                // entire string
                else // Valid bound, return appropriate substring
                        return String(str).substring(0,n);
        }

		fetch_unix_timestamp = function()
		{
			return parseInt(new Date().getTime().toString().substring(0, 10))
		}
	 
		
		if (o)
		    jQuery.extend(s, o);

		return this.each(function(){
			var list = jQuery('<ul class="tweet_list">').prependTo(this);
			var intro = '<p class="tweet_intro">' + s.intro_text + '</p>'
			var outro = '<p class="tweet_outro">' + s.outro_text + '</p>'
			var loading = jQuery('<p class="loading">' + s.loading_text + '</p>');
			
			if(typeof(s.username) == "string"){
      			  s.username = [s.username];
      		}
	  
			var query = '';
			if (s.query) {
				query += 'q=' + s.query;
			}
			query += '&q=from:' + s.username.join('%20OR%20from:');
			
			var url = 'http://search.twitter.com/search.json?&' + query +  '&rpp=' + s.count + '&callback=?' + '&r=' + fetch_unix_timestamp();
			
			if (s.loading_text) jQuery(this).append(loading);
			
			jQuery.getJSON(url, function(data){
			
				if (s.loading_text) loading.remove();
				
				if (s.intro_text) 
					list.before(intro);
			
				jQuery.each(data.results, function(i, item){
					
					var join_text = s.join_text; // tekst tussen datum en tijd
					var join = ((s.join_text) ? join_template : ' ')
					
					var avatar_template = '<a target="twitter" class="tweet_avatar" href="http://twitter.com/' + item.from_user + '"><img src="' + item.profile_image_url + '" height="' + s.avatar_size + '" width="' + s.avatar_size + '" alt="' + item.from_user + '\'s avatar" border="0"/></a>';
					var avatar = (s.avatar_size ? avatar_template : '')
					
					var date = item.created_at;
					
					var text = '<span class="tweet_text">' + jQuery([item.text]).linkUrl().linkUser().linkHash().makeHeart().capAwesome().capEpic()[0] + '</span>';
					
					var tweetStatus = jQuery("#"+item.id).length ? "" : "niet";
					
					
						if (jQuery("#"+item.id).length == 0) { 
							list.append('<li style="display:none" id="' + item.id + '">' + avatar + join + text + '<br /><span class="date">' + format_time(date) + '</span></li>');
							jQuery("#"+item.id).slideDown();
							jQuery("#"+item.id).slideDown("slow");
							jQuery("#"+item.id).slideDown(5000);
							doBlink("#"+item.id,1,1);
						}
						else
						{
							/* bestaande items updaten (past het tijdstip aan van de tweet */
							/* jQuery("#"+item.id).html(avatar + join + text + "<br /><span class=\"date\">" + date + "</span>"); */
						}
				});
				
			});
		});
	};
})(jQuery);

