/*
JUITTER 1.0.0 - 22/07/2009 - http://juitter.com
BY RODRIGO FANTE - http://rodrigofante.com

** jQuery 1.2.* or higher required

Juitter is distributed under the MIT License
Read more about the MIT License --> http://www.opensource.org/licenses/mit-license.php

This script is just a beta test version, download and use it at your own risk.
The Juitter developer shall have no responsability for data loss or damage of any kind by using this script.
*/
(function($) {
var conf = {},
// JUITTER DEFAULT CONFIGURATION ========================
// YOU CAN CHANGE THE DYNAMIC VARS ON CALLING THE start method, see the system.js for more information about it.

numMSG = 30; // set the number of messages to be show
containerDiv="tweets", // //Set a place holder DIV which will receive the list of tweets example <div id="juitterContainer"></div>
loadMSG="Loading messages...", // Loading message, if you want to show an image, fill it with "image/gif" and go to the next variable to set which image you want to use on 
imgName="loader.gif", // Loading image, to enable it, go to the loadMSG var above and change it to "image/gif"
readMore="Read More", // read more message to be show after the tweet content
nameUser="image" // insert "image" to show avatar of "text" to show the name of the user that sent the tweet 
live:"live-20", //optional, disabled by default, the number after "live-" indicates the time in seconds to wait before request the Twitter API for updates, I do not recommend to use less than 60 seconds.
// end of configuration

// some global vars
aURL="";msgNb=1;
var mode,param,time,lang,contDiv,loadMSG,gifName,numMSG,readMore,fromID,ultID,filterWords;
var running=false;
// Twitter API Urls
apifMultipleUSER = "http://search.twitter.com/search.json?from%3A";
apifUSER = "http://search.twitter.com/search.json?q=from%3A";
apitMultipleUSER = "http://search.twitter.com/search.json?to%3A";
apitUSER = "http://search.twitter.com/search.json?q=to%3A";
apiSEARCH = "http://search.twitter.com/search.json?q=";
$.Juitter = {
registerVar: function(opt){
mode=opt.searchType;
param=opt.searchObject;
timer=opt.live;
lang=opt.lang?opt.lang:"";
contDiv=opt.placeHolder?opt.placeHolder:containerDiv;
loadMSG=opt.loadMSG?opt.loadMSG:loadMSG;
gifName=opt.imgName?opt.imgName:imgName;
numMSG=opt.total?opt.total:numMSG;
readMore=opt.readMore?opt.readMore:readMore;
fromID=opt.nameUser?opt.nameUser:nameUser;
filterWords=opt.filter;
openLink=opt.openExternalLinks?"target='_blank'":"";
},
start: function(opt) {		
ultID=0;
if($("#"+contDiv)){	
	this.registerVar(opt);
	// show the load message
	this.loading();
	// create the URL  to be request at the Twitter API
	aURL = this.createURL();
	// query the twitter API and create the tweets list
	this.conectaTwitter(1);		
	// if live mode is enabled, schedule the next twitter API query
	if(timer!=undefined&&!running) this.temporizador();
}   
},
update: function(){
this.conectaTwitter(2);		
if(timer!=undefined) this.temporizador();
},
loading: function(){
if(loadMSG=="image/gif"){
	$("<img></img>")
		.attr('src', gifName)
		.appendTo("#"+contDiv); 
} else $("#"+contDiv).html(loadMSG);
},
createURL: function(){
var url = "";
jlg=lang.length>0?"&lang="+lang:jlg=""; 
var seachMult = param.search(/,/);
if(seachMult>0) param = "&ors="+param.replace(/,/g,"+");
if(mode=="fromUser" && seachMult<=0) url=apifUSER+param;
else if(mode=="fromUser" && seachMult>=0) url=apifMultipleUSER+param;
else if(mode=="toUser" && seachMult<=0) url=apitUSER+param;
else if(mode=="toUser" && seachMult>=0) url=apitMultipleUSER+param;
else if(mode=="searchWord") url=apiSEARCH+param+jlg;
url += "&rpp="+numMSG;		
return url;
},
delRegister: function(){
// remove the oldest entry on the tweets list
if(msgNb>=numMSG){
	$(".twittLI").each(
		function(o,elemLI){
			if(o>=numMSG) $(this).hide("slow");													  
		}
	);
}	
},
conectaTwitter: function(e){
// query the twitter api and create the tweets list
$.ajax({
	url: aURL,
	type: 'GET',
	dataType: 'jsonp',
	timeout: 1000,
	error: function(){ $("#"+contDiv).html("fail#"); },
	success: function(json){
		if(e==1) $("#"+contDiv).html("");				
		$.each(json.results,function(i,item) {
			if(e==1 || (i<numMSG && item.id>ultID)){
				if(i==0){
					tultID = item.id;
					$("<ul></ul>")
						.attr('id', 'twittList'+ultID)
						.attr('class','twittList')
						.prependTo("#"+contDiv);  
				}
				if (item.text != "undefined") {
					var link =  "http://twitter.com/"+item.from_user+"/status/"+item.id;  
					
					var tweet = $.Juitter.filter(item.text);
					
					if(fromID=="image") mHTML="<a href='http://www.twitter.com/"+item.from_user+"'><img src='"+item.profile_image_url+"' alt='"+item.from_user+"' class='juitterAvatar' /></a> "+$.Juitter.textFormat(tweet)+" -| <span class='time'>"+item.created_at+"</span> |- <a href='" + link + "' class='JRM' "+openLink+">"+readMore+"</a>";
					else mHTML="<a href='http://www.twitter.com/"+item.from_user+"'>@"+item.from_user+":</a> "+$.Juitter.textFormat(tweet)+" -| <span class='time'>"+item.created_at+"</span> |-  <a href='" + link + "' "+openLink+">"+readMore+"</a>";
					
					$("<li></li>") 
						.html(mHTML)  
						.attr('id', 'twittLI'+msgNb)
						.attr('class', 'twittLI')
						.appendTo("#twittList"+ultID);

					$('#twittLI'+msgNb).hide();
					$('#twittLI'+msgNb).show("slow");
					
					// remove old entries
					$.Juitter.delRegister();
					msgNb++;								
				}
			}
		});	
		ultID=tultID;
	}
});
},	
filter: function(s){
if(filterWords){
	searchWords = filterWords.split(",");				
	if(searchWords.length>0){
		cleanHTML=s;
		$.each(searchWords,function(i,item){	
			sW = item.split("->").length>0 ? item.split("->")[0] : item;
			rW = item.split("->").length>0 ? item.split("->")[1] : "";					
			regExp=eval('/'+sW+'/gi');					
			cleanHTML = cleanHTML.replace(regExp, rW);							
		});
	} else cleanHTML = s;			
	return cleanHTML;
} else return s;
},
textFormat: function(texto){
//make links
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
texto = texto.replace(exp,"<a href='$1' class='extLink' "+openLink+">$1</a>"); 
var exp = /[\@]+([A-Za-z0-9-_]+)/ig;
texto = texto.replace(exp,"<a href='http://twitter.com/$1' class='profileLink'>@$1</a>"); 
var exp = /[\#]+([A-Za-z0-9-_]+)/ig;
texto = texto.replace(exp,"<a href='http://juitter.com/#$1' onclick='$.Juitter.start({searchType:\"searchWord\",searchObject:\"$1\"});return false;' class='hashLink'>#$1</a>"); 
// make it bold
if(mode=="searchWord"){
	tempParam = param.replace(/&ors=/,"");
	arrParam = tempParam.split("+");
	$.each(arrParam,function(i,item){					
		regExp=eval('/'+item+'/gi');
		newString = new String(' <b>'+item+'</b> ');
		texto = texto.replace(regExp, newString);					  
	});				
}
return texto;
},
temporizador: function(){
// live mode timer
running=true;
aTim = timer.split("-");
if(aTim[0]=="live" && aTim[1].length>0){
	tempo = aTim[1]*1000;
	setTimeout("$.Juitter.update()",tempo);
}
}
};	
})(jQuery);
