Yamm = window.Yamm || {};
Yamm.Widget = function (options) {
    var _this = this;

    this.init = function(options) {

        var defaults = {
            divId: 'yamm-widget',
            q: '',
            hashtags: '',
            noMentions: false,
            noLinks: false,
            updateInterval: 60000,
            rpp: 80,
            sinceDate: '',
            untilDate: '',
            width: 250,
            height: 300,
            mainTitle: 'Twitterújság',
            subTitle: '',
            footer: '<a href="http://yamm.hu/widget">yamm.hu/widget</a>',
            avatars: true,
            theme: {
                shell: {
                    color: '#fff',
                    linkColor: '#fff',
                    bgColor: '#000'
                },
                tweet: {
                    color: '#333',
                    linkColor: '#064599',
                    bgColor: '#f8f8f8'
                },
                customCSS: '',
                customHTMLFormatter: ''
            },
            charset: 'UTF-8'
        }

        this.options = defaults;
        for (var k in options) {
            this.options[k] = options[k];
        }

        this.page = 1;
        this.hits = 0;
        this._updaterTimeout = null;

        this.globalCallbackName = '__Yamm_Widget_cb_' + this.options.divId.replace(/-/g, '_');
        window[this.globalCallbackName] = this.updateCallback;
    }

    this.start = function() {
        // create CSS rules
        
        var sheetId = this.options.divId + '-stylesheet';

        var W = parseInt(this.options.width, 10) - 62;
        var css = '\
            .yamm-widget {\
            }\
            .yamm-widget-header {\
                padding: 4px;\
            }\
            .yamm-widget-header .main-title {\
                font-weight: bold;\
                font-size: 16px;\
                font-family: Arial;\
            }\
            .yamm-widget-header .sub-title {\
                font-size: 11px;\
                font-family: Verdana;\
            }\
            .yamm-widget-footer {\
                text-align: center;\
                font-size: 11px;\
                padding: 4px;\
            }\
            .yamm-widget-tweets {\
                overflow-y: scroll;\
                padding-left: 2px;\
            }\
            .yamm-widget-tweet {\
                float: left;\
                margin: 0;\
                border-top: 1px solid #ddd;\
                padding: 6px 0;\
                font-size: 11px;\
                font-family: Verdana;\
                text-align: left;\
            }\
            .yamm-widget-tweet:first-child {\
                border-top: none;\
                padding-top: 4px;\
            }\
            .yamm-widget-tweet-avatar {\
                display: block;\
                float: left;\
                width: 30px;\
                height: 30px;\
                margin: 0 7px 0 3px;\
            }\
            .yamm-widget-tweet-avatar img {\
                float: left;\
                width: 30px;\
                height: 30px;\
                border: none;\
            }\
            .yamm-widget-tweet div {\
                float: left;\
                width: ' + W + 'px;\
                overflow-x: hidden;\
                word-wrap: break-word;\
            }\
            .yamm-widget-tweet .yamm-widget-tweet-date, .yamm-widget-tweet .yamm-widget-tweet-date:hover {\
                white-space: nowrap;\
                font-size: 9px;\
                color: #999999;\
            }\
            .yamm-widget-tweets-no-avatar .yamm-widget-tweet-avatar {\
                display: none;\
            }\
            .yamm-widget-tweets-no-avatar div {\
                width: ' + (W + 40) + 'px;\
            }\
            .yamm-widget {\
                border: 1px solid #' + this.options.theme.shell.bgColor + ';\
            }\
            .yamm-widget-header, .yamm-widget-footer {\
                color: #' + this.options.theme.shell.color + ';\
                background-color: #' + this.options.theme.shell.bgColor + ';\
            }\
            .yamm-widget-header a, .yamm-widget-header a:hover, .yamm-widget-footer a, .yamm-widget-footer a:hover {\
                color: #' + this.options.theme.shell.linkColor + ';\
            }\
            .yamm-widget-tweets {\
                background-color: #' + this.options.theme.tweet.bgColor + ';\
            }\
            .yamm-widget-tweet {\
                color: #' + this.options.theme.tweet.color + ';\
                background-color: #' + this.options.theme.tweet.bgColor + ';\
            }\
            .yamm-widget-tweet a, .yamm-widget-tweet a:hover {\
                color: #' + this.options.theme.tweet.linkColor + ';\
            }';

        css += this.options.theme.customCSS;

        var sheetEl = document.getElementById(sheetId);
        if (!sheetEl) {
            var sheetEl = document.createElement('style');
            sheetEl.id = sheetId;
            sheetEl.type = 'text/css';
            document.getElementsByTagName('head')[0].appendChild(sheetEl);
        }

        if (sheetEl.styleSheet) { // IE
            sheetEl.styleSheet.cssText = css;
        } else {
            while (sheetEl.childNodes.length >= 1) {
                sheetEl.removeChild(sheetEl.firstChild);
            }
            var frag = document.createDocumentFragment();
            frag.appendChild(document.createTextNode(css));
            sheetEl.appendChild(frag);
        }

        
        // create basic DOM structure
        var wrapDiv = document.createElement('div');
        wrapDiv.className = 'yamm-widget';
        wrapDiv.style.width = (this.options.width || '300') + 'px';

        var headerDiv = document.createElement('div');
        headerDiv.className = 'yamm-widget-header';
        var html = '<div class="main-title">' + this.options.mainTitle + '</div>'
            + '<div class="sub-title">' + this.options.subTitle + '</div>';
        headerDiv.innerHTML = html;

        var tweetsDiv = document.createElement('div');
        tweetsDiv.className = 'yamm-widget-tweets';
        if (this.options.height != 'auto') {
            tweetsDiv.style.height = (this.options.height || '300') + 'px';
        } else {
            tweetsDiv.style.height = 'auto';
        }
        if (!this.options.avatars) {
            tweetsDiv.className += ' yamm-widget-tweets-no-avatar';
        }
        //tweetsDiv.style.overflow = 'auto';

        var footerDiv = document.createElement('div');
        footerDiv.className = 'yamm-widget-footer';
        footerDiv.innerHTML = this.options.footer;

        wrapDiv.appendChild(headerDiv);
        wrapDiv.appendChild(tweetsDiv);
        wrapDiv.appendChild(footerDiv);

        this.wrapDiv = wrapDiv;
        this.tweetsDiv = tweetsDiv;
        var parentEl = document.getElementById(this.options.divId);
        parentEl.appendChild(this.wrapDiv);

        if (typeof(this.options.theme.customHTMLFormatter) == 'string' &&
            this.options.theme.customHTMLFormatter == 'getHtmlForTweet2')
        {
            this.tweetHtmlFn = this.getHtmlForTweet2;
        } else {
            this.tweetHtmlFn = this.getHtmlForTweet;
        }

        this.startUpdate();
    }

    this.stop = function() {
        this.stopUpdate();
    }

    this.startUpdate = function() {
        this.doUpdate();
    }

    this.stopUpdate = function() {
        if (_this._updaterTimeout) {
            clearTimeout(_this._updaterTimeout);
        }
    }

    this.setPage = function(page) {
        this.stopUpdate();
        this.tweetsDiv.innerHTML = '';
        this.page = parseInt(page, 10);
        this.startUpdate();
    }

    this.getNumPages = function() {
        numPages = parseInt((this.hits + this.options.rpp - 1) / this.options.rpp, 10);
        return numPages;
    }

    this.doUpdate = function() {
        var script = document.createElement('script');
        var url = 'http://static.yamm.hu/widget/data/' + _this.options.app + '?'
            + 'q=' + encodeURIComponent(_this.options.q)
            + '&hashtags=' + encodeURIComponent(_this.options.hashtags)
            + '&no-mentions=' + (_this.options.noMentions ? '1' : '0')
            + '&no-links=' + (_this.options.noLinks ? '1' : '0')
            + '&word-blacklist=' + (_this.options.wordBlacklist ? '1' : '0')
            + '&rpp=' + encodeURIComponent(_this.options.rpp)
            + '&page=' + encodeURIComponent(_this.page)
            + '&since-date=' + encodeURIComponent(_this.options.sinceDate)
            + '&until-date=' + encodeURIComponent(_this.options.untilDate)
            + '&format=json&callback=' + encodeURIComponent(_this.globalCallbackName);
        if (_this.options.charset) {
            url += '&charset=' + encodeURIComponent(_this.options.charset);
        }

        script.src = url;
        document.getElementsByTagName('head')[0].appendChild(script);

        _this._updaterTimeout = setTimeout(_this.doUpdate, _this.options.updateInterval);
    }

    this.updateCallback = function(res) {
        var newTweets = [];
        _this.hits = res['hits'];
        var len = res['results'].length;
        for (var i=0; i<len; i++) {
            var tweet = res['results'][i];
            var id = tweet['id'];
            if (document.getElementById(_this.options.divId + '-yamm-widget-tweet-' + id)) {
                break;
            }
            newTweets.push(tweet);
        }

        var html = '';
        for (var i=newTweets.length-1; i>=0; i--) {
            var tweet = newTweets[i];
            html = _this.tweetHtmlFn(tweet) + html;
        }
        if (html != '') {
            _this.tweetsDiv.innerHTML = html + _this.tweetsDiv.innerHTML;
        }
    }

    this.getHtmlForTweet = function(tweet) {
        if (typeof(_this.customHTMLFormatterFn) == 'function') {
            var html = _this.customHTMLFormatterFn(_this, tweet);
            return html;
        }
        var timeDiffStr = _this.humanTimeDiff(tweet).replace(' ', '&nbsp;');
        var text = _this.formatText(tweet['text']);

        var html = ''
            + '<div id="' + _this.options.divId + '-yamm-widget-tweet-' + tweet['id'] + '" class="yamm-widget-tweet">'
            + '<a  class="yamm-widget-tweet-avatar" href="http://yamm.hu/' + tweet['user']['screen_name'] + '" target="_blank"><img src="' + tweet['user']['profile_image_url'] + '"></a>'
            + '<div>'
            + '<a class="yamm-widget-tweet-author" href="http://yamm.hu/' + tweet['user']['screen_name'] + '" target="_blank">' + tweet['user']['screen_name'] + '</a>'
            + ' ' + text
            + ' <a class="yamm-widget-tweet-date" href="' + tweet['url'] + '" target="_blank">' + timeDiffStr + '</a>'
            + '</div>'
            + '</div>';
        return html;
    }

    this.getHtmlForTweet2 = function(tweet) {
        var parts = tweet["created_at"].split(" ");
        var dateParts = parts[0].split("-");
        var timeParts = parts[1].split(":");
        for (var i=0; i<dateParts.length; i++) dateParts[i] = parseInt(dateParts[i], 10);
        for (var i=0; i<timeParts.length; i++) timeParts[i] = parseInt(timeParts[i], 10);
        var createdAt = new Date(Date.UTC(dateParts[0], dateParts[1]-1, dateParts[2],
                timeParts[0], timeParts[1], timeParts[2]));
        var monthNames = ["január", "február", "március", "április", "május", "június",
            "július", "augusztus", "szeptember", "október", "november", "december"];

        var rightPad = function(str, pad, len) {
            var s = "" + str;
            var ret = "";
            var need = len - s.length;
            if (need > 0) {
                for (var i=0; i<need; i++) ret += pad;
            }
            ret += s;
            return ret;
        }

        //var dateStr = createdAt.getFullYear() + "."
        //    + " " + monthNames[createdAt.getMonth()]
        //    + " " + createdAt.getDate() + "."
        //    + " " + rightPad(createdAt.getHours(), "0", 2)
        //    + ":" + rightPad(createdAt.getMinutes(), "0", 2);
        var dateStr = rightPad(createdAt.getHours(), "0", 2)
            + ":" + rightPad(createdAt.getMinutes(), "0", 2);

        var replyText = "@" + tweet["user"]["screen_name"] + " ";
        var replyUrl = "http://yamm.hu/?status=" + encodeURIComponent(replyText) + "&in_reply_to_status_id=" + encodeURIComponent(tweet["id"]);
        var rtText = "RT @" + tweet["user"]["screen_name"] + " " + tweet["text"];
        var rtUrl = "http://yamm.hu/?status=" + encodeURIComponent(rtText);

        var text = tweet["text"];
        text = text.replace('#isva', '');
        text = text.replace('#ivsa', '');
        if (typeof(tweet.links) != "undefined") {
            for (var i=0; i<tweet["links"].length; i++) {
                var shortUrl = tweet["links"][i][0];
                var longUrl = tweet["links"][i][1];
                if (longUrl != null) {
                    text = text.replace(shortUrl, longUrl);
                }
            }
        }
        var text = _this.formatText(text);

        var mediaHtml = "";
        if (typeof(tweet.media) != "undefined") {
            var images = tweet["media"]["images"] || [];
            for (var i=0; i<images.length; i++) {
                mediaHtml += "<div class=\"image\"><a style=\"outline: none;\" href=\"" + images[i]["url"]  + "\" target=\"_blank\"><img src=\"" + images[i]["mid_url"] + "\"></a></div>";
            }
            var videos = tweet["media"]["videos"] || [];
            for (var i=0; i<videos.length; i++) {
                mediaHtml += "<div class=\"video\">" + videos[i]["embed_html"] + "</div>";
            }
        }

        var html = ""
            + "<div id=\"" + _this.options.divId + "-yamm-widget-tweet-" + tweet["id"] + "\" class=\"yamm-widget-tweet\">"
            + " <p class=\"text\">" + text + "</p>"
            + mediaHtml
            + " <p class=\"date\">" + dateStr + " | <a href=\"" + replyUrl + "\" target=\"_blank\">válasz erre twitteren</a> | <a href=\"" + rtUrl + "\" target=\"_blank\">retweet</a></p>"
            + "</div>";
        return html;
    }


    this.humanTimeDiff = function (tweet) {
        var parts = tweet['created_at'].split(' ');
        var dateParts = parts[0].split('-');
        var timeParts = parts[1].split(':');
        for (var i=0; i<dateParts.length; i++) dateParts[i] = parseInt(dateParts[i], 10);
        for (var i=0; i<timeParts.length; i++) timeParts[i] = parseInt(timeParts[i], 10);
        var createdAt = new Date(Date.UTC(dateParts[0], dateParts[1]-1, dateParts[2],
                timeParts[0], timeParts[1], timeParts[2]));
        var diff = (new Date() - createdAt) / 1000.0;

        var timeDiffStr = '';
        if (diff < 60) timeDiffStr = 'most';
        else if (diff < 60 * 60) timeDiffStr = parseInt(diff / 60, 10) + ' perce';
        else if (diff < 24 * 60 * 60) timeDiffStr = parseInt(diff / 60 / 60, 10) + ' órája';
        else timeDiffStr = parseInt(diff / 24 / 60 / 60, 10) + ' napja';

        return timeDiffStr;
    }

    this.formatText = function (text) {
        var ret = text.replace(/(http:\/\/\S+)/gi, '<a href="$1" target="_blank">$1</a>');
        return ret;
    }

    this.init(options);
};

