(function($) {
    
    $.Twitter = function(options) {
        this.username = options.username;
        this.tweetCount = options.tweetCount;
        this.target = options.target;
        this.html = "";
        this.tweets = {};
        var defaultLang = "german";
        this.language = options.language ? ($.Twitter.languages[options.language] ? options.language : defaultLang) : defaultLang;
    };
    
    $.Twitter.languages = {
        german: {
            oneMinute: "vor einer Minute",
            minutes: {
                pre: "vor ",
                after: " Minuten"
            },
            oneHour: "vor einer Stunde",
            hours: {
                pre: "vor ",
                after: " Stunden"
            },
            oneDay: "vor einem Tag",
            days: {
                pre: "vor ",
                after: " Tagen"
            }
        }  
    };
    
    $.Twitter.prototype = 
    {
        /**
        @param 
        */
        receiveTweets: function(callback) {
            var self = this;
            $.getJSON("http://twitter.com/status/user_timeline/" + self.username + ".json?count=" + self.tweetCount + "&callback=?",
                function(tweets) {
                    self.tweets = tweets;
                    self.transformData(self.language);
                    callback.call(self);
                });
        },
        
        transformData: function(language) {
            
            function transformTime(time) {
            
                // Fix for IE8: result of Date.parse() is wrong with Twitter-Time-String.
                // IE8 cant handle: Sat Apr 17 18:44:50 +0000 2010
                // but can handle:  Sat Apr 17 18:44:50 2010 +0000
                if(Date.parse("Thu Jan 01 01:00:00 +0100 1970") !== 0) {

                    // Todo: refactor var's away when go to production code.
                    var length = time.length;
                    var year = time.substring(length - 5, length);
                    var timeZone = time.substring(length - 11, length - 5);
                    time = time.substring(0, length - 11) + year + timeZone;

                }

                var creationTime = Date.parse(time),
                    now = new Date(),
                    delta = parseInt((now.getTime() - creationTime) / 1000, 10),
                    textParts = $.Twitter.languages[language];


                // Cache language parts to reduce Object-Property lookups.
                var minutes = textParts.minutes;
                var hours = textParts.hours;
                var days = textParts.days;

                if (delta < 60) {
                    return textParts.oneMinute;
                } else if (delta < 300) {
                    return minutes.pre + 5 + minutes.after;
                } else if (delta < 2700) {
                    return minutes.pre + parseInt(delta / 60, 10) + minutes.after;
                } else if (delta < 5400) {
                    return textParts.oneHour;
                } else if (delta < 86400) {
                    return hours.pre + parseInt(delta / 3600, 10) + hours.after;
                } else if (delta < 172800) {
                    return textParts.oneDay;
                } else {
                    return days.pre + parseInt(delta / 86400, 10) + days.after;
                }
                
            }
            
            var target = this.target;
            
            function transformText(text) {
                
                var textArr = [],
                temp = "",
                i;

                // Todo: use Regex to split text into Array

                // Split text in TextTokens
                for (var i = 0, len = text.length; i < len; i++) {

                    var item = text[i];

                    if (item !== " " && item !== ":" && item !== "(" && item !== ")") {
                        temp += item;
                    } else {
                        textArr.push(temp);
                        temp = "";
                        textArr.push(item); // insert Splitter as single token
                    }
                }

                // add last Item after loop
                textArr.push(temp);

                var linkOpen = "<a" + (target !== "" ? (" target='" + target + "'") : "");

                // transform tokens to HTML(Anchors)
                // .length nicht cachen! .length verändert sich in der Schleife.
                for (i = 0; i < textArr.length; i++) {

                    var item = textArr[i];
                    var itemLength = item.length;

                    if (item !== " ") {
                        if (item[0] === "#") {
                            textArr[i] = [linkOpen, " class='hashtag' href='http://twitter.com/search?q=%23", item.slice(1, itemLength), "'>", item, "<a/>"].join("");
                        } else if (item[0] === "@") {
                            textArr[i] = ["@", linkOpen, " class='username' href='http://www.twitter.com/", item.slice(1, itemLength), "'>", item.slice(1, itemLength), "</a>"].join("");
                        } else if (item.slice(0, 3) === "ftp" || item.slice(0, 4) === "http" || item.slice(0, 5) === "https") {
                            var completedLink = [textArr[i], textArr[i + 1], textArr[i + 2]].join("");
                            textArr[i] = [linkOpen, " class='link' href='", completedLink, "'>", completedLink, "</a>"].join("");
                            textArr.splice(i + 1, 2);
                        }
                    }
                }

                // transform Tokens back to one String
                return textArr.join("");
            }
            
            var tweet;
            var tweets = this.tweets;
            var len = tweets.length;
            var i = -1;
            while(++i < len) {
                tweet = tweets[i];
                tweet.created_at = transformTime(tweet.created_at);
                tweet.text = transformText(tweet.text);
            }
            
        }
        
    };
    
})(jQuery);
