/*
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
    if('https:' == document.location.protocol) {
        apifMultipleUSER = "https://search.twitter.com/search.json?from%3A";
        apifUSER = "https://search.twitter.com/search.json?q=from%3A";
        apitMultipleUSER = "https://search.twitter.com/search.json?to%3A";
        apitUSER = "https://search.twitter.com/search.json?q=to%3A";
        apiSEARCH = "https://search.twitter.com/search.json?q=";
    } else {
        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){
                    var tultID;
                    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(window.dataRelativa) {
                                    item.created_at = dataRelativa(item.created_at);
                                }

                                /*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' /></a> "+$.Juitter.textFormat(tweet)+" -| <span class='time'>"+item.created_at+"</span> |- <a href='" + link + "' class='JRM' "+openLink+">"+readMore+"</a>";
                                else mHTML="<a href='http://www.twitter.com/"+item.from_user+"'>@"+item.from_user+":</a> "+$.Juitter.textFormat(tweet)+" -| <span class='time'>"+item.created_at+"</span> |-  <a href='" + link + "' "+openLink+">"+readMore+"</a>";*/

                                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' /></a> "+$.Juitter.textFormat(tweet)+"<br /><span class='time'>"+item.created_at+"</span>";
                                else mHTML="<a href='http://www.twitter.com/"+item.from_user+"'>@"+item.from_user+":</a> "+$.Juitter.textFormat(tweet)+"<br /><span class='time'>"+item.created_at+"</span>";

                                $("<li></li>")
                                .html(mHTML)
                                .attr('id', 'twittLI'+msgNb)
                                .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);
