(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 = 5; // 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="loading.gif", // Loading image, to enable it, go to the loadMSG var above and change it to "image/gif"
readMore="Read it on Twitter", // 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-15", //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;
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?lang=en&q=-ass%2C-pussy%2C-3D%2C-fuck%2C-cunts%2C-fuck%2C-lunch%2C-bitch%2C-fucking%2C-Social%2C-fucked%2C-dick%2C-Credit%2C-closet%2C-drink";
$.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?nameUser:nameUser;
},
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: 4000,
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;  

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' width='48' height='48' /></a> "+$.Juitter.textFormat(item.text)+" ";
else mHTML="<a href='http://www.twitter.com/"+item.from_user+"'>@"+item.from_user+":</a> "+$.Juitter.textFormat(item.text)+ " ";

$("<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;
}
});
},		
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'>$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://search.twitter.com/search?q=%23$1' target='blank' 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+'/ig');
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);