/*
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)
                .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 class='user_image_link' href='http://www.twitter.com/"+item.from_user+"' target='_blank'><img src='"+item.profile_image_url+"' alt='"+item.from_user+"' class='user_avatar' /></a>"+"<p><a href='" + link + " 'target='_blank'><strong>"+item.from_user+"</strong></a> "+$.Juitter.textFormat(tweet)+"</p><div class='clear'></div>";
                else mHTML="<p><a href='http://www.twitter.com/"+item.from_user+"' target='_blank'>@"+item.from_user+":</a> "+$.Juitter.textFormat(tweet)+"</p><div class='clear'></div>";
                $("<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+" target='_blank'>$1</a>");
          var exp = /[\@]+([A-Za-z0-9-_]+)/ig;
          texto = texto.replace(exp,"<a href='http://twitter.com/$1' class='profileLink' target='_blank'>@$1</a>");
          var exp = /[\#]+([A-Za-z0-9-_]+)/ig;
          texto = texto.replace(exp,"<a href='http://twitter.com/#search?q=%23$1' class='hashLink' target='_blank'>#$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);

