/*
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 = 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,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)
                  .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+"'></a> "+$.Juitter.textFormat(tweet)+"<span class='time'>"+item.created_at;
                else mHTML="<a href='http://www.twitter.com/"+item.from_user+"'>@"+item.from_user+":</a> "+$.Juitter.textFormat(tweet)+"<span class='time'>"+item.created_at;
                
                $("<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);
