"use strict";
/* global $ */

// Using jquery.twitter.js as an example, create a twitter JS component with the following features:
//
// Configuration:
// - Specify one or more users
// - Specify number of tweets to show
// - Specify number of tweets to cache (FIFO, hidden DIV)
// - Specify optional refresh interval
// - Specify show/hide twitter pic
// - Specify exclude replies
//
// Implementation:
//
// On initialisation:
// - Run a search requesting the most recent 'x' tweets where x is the cache size
// - Pass results to the display handler
// - Schedule a refresh if required
//
// On refresh:
// - Run a fresh search constrained to the time since the last refresh
// - Pass results to the display handler
// - Schedule a refresh
//

var twitter = twitter || {};

twitter.init = function(args) {

    twitter.config = {
        containerId:      "twitter",
        users:            [],
        displaySize:      5,
        cacheSize:        15,
        refreshTweets:    true,
        refreshInterval:  60,
        showName:         true,
        showIcon:         true
    };

    for (var name in args) {
        if (twitter.config[name]) {
            twitter.config[name] = args[name];
        }
    }

    twitter.searchUrl = "http://search.twitter.com/search.json";
    twitter.linkPrefix = "http://www.twitter.com/";

    twitter.initialConstraints = {
        lang: "en",
        page: 1,
        rpp: twitter.config.cacheSize
    };

    $("#" + twitter.config.containerId).removeClass("hidden");

};

twitter.start = function(args) {
    if (args.users != '') {
        twitter.init(args);
        twitter.executeSearch(twitter.createInitialSearchQuery(), twitter.populate);
    }
};

twitter.executeSearch = function(query, callback) {
    // TODO encode search args - see metadata.js for passing a map of args that get encoded by jQuery
    $.ajax({
                url: twitter.createSearchUrl(query),
                dataType: "jsonp",
                success: callback
            });
};

twitter.populate = function(data) {
    var lastId = twitter.updateView(data.results);
    if (twitter.config.refreshTweets) {
        setTimeout('twitter.executeRefresh(' + lastId + ')', twitter.config.refreshInterval * 1000);
    }
};

twitter.executeRefresh = function(lastId) {
    twitter.executeSearch(twitter.createRefreshSearchQuery(lastId), twitter.refresh);
};

twitter.refresh = function(data) {
    var lastId = twitter.updateView(data.results);
    setTimeout('twitter.executeRefresh(' + lastId + ')', twitter.config.refreshInterval * 1000);
};

twitter.updateView = function(tweets) {

    var lastId = '';

    for (var index = tweets.length - 1; index >= 0; index--) {
        var tweet = tweets[index];
        var id = "#tweet" + tweet.id;
        if ($(id).length == 0) {
            twitter.addTweet(tweets[index]);
            lastId = tweet.id;
        }
    }

    twitter.reveal();

    if (lastId == '' && $("#" + twitter.config['containerId']).children().length > 0) {
        lastId = $("#" + twitter.config['containerId']).children().first().attr('id').substr(5);
    }

    return lastId;

};

twitter.reveal = function() {

    var div = $("#" + twitter.config['containerId']).children(":hidden").last();
    if (div) {
        var hidden = $("#" + twitter.config['containerId']).children(":hidden").length;
        var total = $("#" + twitter.config['containerId']).children().length;
        if (total - hidden > twitter.config.displaySize) {
            $("#" + twitter.config['containerId']).children().last().slideUp('slow', function() {
                $("#" + twitter.config['containerId']).children().last().detach();
                $(this).detach();
            });
        }
        div.slideDown('slow', function() {
//            div.removeClass("hidden");
            twitter.reveal();
        });
    }

}

twitter.addTweet = function(tweet) {

    var id = "tweet" + tweet.id;
    var icon = "";
    if (twitter.config.showIcon) {
        icon = htmlRenderer.createDiv({'class': "tweetIcon"}, htmlRenderer.createLink({href: twitter.linkPrefix + tweet.from_user, target: "_blank"}, htmlRenderer.createImg({src: tweet.profile_image_url, width: 40})));
    }
    var link = "";
    if (twitter.config.showName) {
        link = htmlRenderer.createDiv({'class': "tweetName"}, htmlRenderer.createLink({href: twitter.linkPrefix + tweet.from_user, target: "_blank"}, tweet.from_user_name) + "&nbsp;");
    }
    var message = htmlRenderer.createDiv({'class': "tweetText"}, tweet.text);
    var div = htmlRenderer.createDiv({id: id, 'class': "tweet hidden"}, icon + link + message + htmlRenderer.createDiv({'class': "clear"}, ""));

    $("#" + twitter.config['containerId']).prepend(div);
};

twitter.createSearchUrl = function(query) {
    return twitter.searchUrl + "?" + query;
};

twitter.createInitialSearchQuery = function() {
    return twitter.createSearchCriteria() + twitter.createInitialSearchConstraints();
};

twitter.createRefreshSearchQuery = function(lastId) {
    return twitter.createSearchCriteria() + twitter.createRefreshSearchConstraints(lastId);
};

twitter.createSearchCriteria = function() {

    var criteria = "";

    for (var index = 0; index < twitter.config.users.length; index++) {
        if (criteria.length > 0) {
            criteria += "%20OR%20";
        }
        criteria += "from%3a";
        criteria += twitter.config.users[index];
    }

    return "q=" + criteria;

};

twitter.createInitialSearchConstraints = function() {

    var constraints = "";

    for (var name in twitter.initialConstraints) {
        constraints += "&";
        constraints += name;
        constraints += "=";
        constraints += twitter.initialConstraints[name];
    }

    return constraints;

};

twitter.createRefreshSearchConstraints = function(sinceId) {

    var constraints = "";

    for (var name in twitter.initialConstraints) {
        constraints += "&";
        constraints += name;
        constraints += "=";
        constraints += twitter.initialConstraints[name];
    }

    if (sinceId != '') {
        constraints += "&";
        constraints += "since_id";
        constraints += "=";
        constraints += sinceId;
    }

    return constraints;

};
