/*
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.

		messagesToShow       = 20; // set the number of messages to be show
		containerDiv = "#juitterContainer", // //Set a place holder DIV which will receive the list of tweets example <div id                                                               = "juitterContainer"></div>
		loadingMessage      = "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 loadingMessage 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-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="";
                messageNumber=1;
		var mode,param,time,lang,containerSelector,loadingMessage,gifName,messagesToShow,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(options){
			mode           = options.searchType;
			param          = options.searchObject;
			timer          = options.live;
			lang           = options.lang        ? options.lang:"";
			containerSelector        = options.placeHolder ? options.placeHolder : containerDiv;
			loadingMessage        = options.loadingMessage     ? options.loadingMessage : loadingMessage;
			gifName        = options.imgName     ? options.imgName : imgName;
			messagesToShow = options.total       ? options.total : messagesToShow;
			readMore       = options.readMore    ? options.readMore : readMore;
			fromID         = options.nameUser    ? options.nameUser : nameUser;
			filterWords    = options.filter;
			openLink       = options.openExternalLinks ? "target                   = '_blank'" : "";
		},

		start: function(options) {		
			ultID = 0;
			if($(containerSelector)){
				this.registerVar(options);
				// 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 (loadingMessage=="image/gif") {
                          $("<img></img>")
                                  .attr('src', gifName)
                                  .appendTo(containerSelector); 
                        } else {
                          $(containerSelector).html(loadingMessage);
                        } 
		},
		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="+messagesToShow;
			return url;
		},

		delRegister: function(){
			// remove the oldest entry on the tweets list
			if ( messageNumber >= messagesToShow ){
				$(".twittLI").each(function(index,liElement){
						if(index >= messagesToShow) $(this).hide("slow");
                                });
			}	
		},

                listElement: function(item) {
                  tultID = item.id;
                  return $("<ul></ul>")
                    .attr('id', 'twittList'+ultID)
                    .attr('class','twittList');
                },

                tweetLinkUrl: function(item) {
                  return "http://twitter.com/"+item.from_user+"/status/"+item.id;
                },

                messageHTMLForText: function(item) {
                  return "<a href='http://www.twitter.com/"+item.from_user+"'>@"+item.from_user+":</a> "+$.Juitter.textFormat(tweet)+" <div class='meta'> <span class='time'>"+item.created_at+"</span>  <a href='" + link + "' "+openLink+">"+readMore+"</a></div>";
                },
                messageHTMLForImage: function(item) {
                  return "<a href='http://www.twitter.com/"+item.from_user+"'><img src='"+item.profile_image_url+"' alt='"+item.from_user+"' class='juitterAvatar' /></a> <p class='twittText'>"+item.formattedTweet+" </p>  <span class='time'>"+item.created_at+"</span> - <a href='" + item.linkURL + "' class='JRM' "+openLink+">"+readMore+"</a>";
                  
                },

		conectaTwitter: function(e){
			// query the twitter api and create the tweets list
			$.ajax({
				url: aURL,
				type: 'GET',
				dataType: 'jsonp',
				timeout: 1000,
				error: function(){ $(containerSelector).html("fail#"); },
				success: function(json){
					if(e==1) $(containerSelector).html("");				
					$.each(json.results,function(i,item) {
						if(e==1 || (i<messagesToShow && item.id>ultID)){
							if(i==0) {
                                                                $.Juitter.listElement(item).prependTo(containerSelector);
							}

							if (item.text != "undefined") {
                                                          item.linkURL = $.Juitter.tweetLinkUrl(item);
                                                          item.filteredTweet = $.Juitter.filter(item.text);
                                                          item.formattedTweet = $.Juitter.textFormat(item.filteredTweet);

                                                                if (fromID=="image") {
                                                                  messageHTML = $.Juitter.messageHTMLForImage(item);
                                                                } else {
                                                                  messageHTML = $.Juitter.messageHTMLForText(item);
                                                                }
								
								$("<li></li>") 
									.html(messageHTML)  
									.attr('id', 'twittLI'+messageNumber)
									.attr('class', 'twittLI')
									.appendTo("#twittList"+ultID);

								$('#twittLI' + messageNumber).hide();
								$('#twittLI' + messageNumber).show("slow");
								
								// remove old entries
								$.Juitter.delRegister();
								messageNumber++;								
							}
						}
					});	
					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);
