/*
JUITTER 0.9.4 - 02/03/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(jQuery) {
	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 = 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>
		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 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="";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?q=";

    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 'less than a minute ago';
      } else if(delta < 120) {
      return 'about a minute ago';
      } else if(delta < (45*60)) {
      return (parseInt(delta / 60)).toString() + ' minutes ago';
      } else if(delta < (120*60)) {
      return 'about an hour ago';
      } else if(delta < (24*60*60)) {
      return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
      } else if(delta < (48*60*60)) {
      return '1 day ago';
      } else {
      return (parseInt(delta / 86400)).toString() + ' days ago';
      }
    }

  	jQuery.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 == false) ? opt.readMore:readMore;
  			fromID=opt.nameUser?nameUser:nameUser;
  		},
  		start: function(opt) {		
  			ultID=0;
  			if(jQuery("#"+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"){
  				jQuery("<img></img>")
  					.attr('src', gifName)
  					.appendTo("#"+contDiv); 
  			} else jQuery("#"+contDiv).html(loadMSG);
  		},
  		createURL: function(){
  			var url = "";
  			jlg=lang.length>0?"&lang="+lang:jlg=""; 

  			var seachMult = param.search(/,/);
  			if (seachMult>0) param = param.replace(/[ ,]/g,"+");
  			param = param.replace(/#/g, "%23");

  			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){
  				jQuery(".twittLI").each(function(o, li) {
  				  var el = jQuery(this);
						if (o >= numMSG) {
						  el.remove();
					  } else {
					    el.find(".date").text(relative_time(li.when));
					  }
  				});
  			}
  			// remove empty twittList's
  			jQuery(".twittList:empty").each(function(o, ul) {
  			  ul.remove();
  			});
  		},
  		conectaTwitter: function(e){
  			// query the twitter api and create the tweets list
  			jQuery.ajax({
  				url: aURL,
  				type: 'GET',
  				dataType: 'jsonp',
  				timeout: 1000,
  				error: function(){ jQuery("#" + contDiv).html("fail#"); },
  				success: function(json){
  					if (e == 1) jQuery("#" + contDiv).html("");				
  					jQuery.each(json.results,function(i,item) {
  						if (e == 1 || (i < numMSG && item.id > ultID)) {
  							if (i == 0) {
  								tultID = item.id;
  								jQuery("<ul></ul>").attr('id', 'twittList'+ultID).attr('class','twittList').prependTo("#"+contDiv);
  							}

  							if (item.text != "undefined") {
  							  var when   = new Date(item.created_at);
                  var date   = "<span class='date'>" + relative_time(when) + "</span>";
                  var text   = "<span class='text'>" + jQuery.Juitter.textFormat(item.text) + "</span>";
                  
								  var mHTML  = "- " + text;
  								var li = jQuery("<li></li>").html(mHTML).attr('id', 'twittLI'+msgNb).attr('class', 'twittLI').appendTo("#twittList"+ultID);
  								li[0].when = when;
                  // li.hide();
                  // li.show("slow");
								
  								// remove old entries
  								jQuery.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>"); 
  			if(mode=="searchWord"){
  				tempParam = param.replace(/&ors=/,"");
  				arrParam = tempParam.split("+");
  				jQuery.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("jQuery.Juitter.update()",tempo);
  			}
  		}
  	};	
})(jQuery);
