﻿registerNS("Tegud.Twitter");

Tegud.Twitter.Init = function () {
    $("#TwitterDiv")
        .delegate("#TwitterRefresh", "click", Tegud.Twitter.Load)
        .delegate("#TwitterNext", "click", function () { Tegud.Twitter.HistoryShift(1); })
        .delegate("#TwitterPrev", "click", function () { Tegud.Twitter.HistoryShift(-1); })
        .delegate("#TwitterFirst", "click", Tegud.Twitter.HistoryGotoFirst)
        .delegate(".TwitterGeoMarker", "click", function () {
            var contentDiv = $("#TwitterHistoryContent");
            var currentIndex = contentDiv.data("CurrentIndex");
            var statuses = contentDiv.data("Posts");

            if (!statuses || currentIndex == undefined || !statuses[currentIndex] || !statuses[currentIndex].geo)
                return;

            var posArr = statuses[currentIndex].geo.point.split(" ");
            var pos = {
                lat: posArr[0],
                long: posArr[1]
            };

            var markerPos = $(this).offset();

            var mapDiv = $("#BlogMap");

            if (mapDiv.length && mapDiv.data("TwitterMarker")) {
                Tegud.Mapping.Hide();
                return;
            }

            mapDiv = Tegud.Mapping.GetMap(pos).css({
                top: markerPos.top,
                left: markerPos.left - 305
            }).data("TwitterMarker", true);

            Tegud.Mapping.CenterOn(pos, true, undefined, mapDiv);

            $("body").bind("click.HideMap", function (e) {
                var clickTarget = $(e.target);
                if (clickTarget.closest("#BlogMap").length || clickTarget.hasClass("TwitterGeoMarker") || clickTarget.hasClass("LocationMarker"))
                    return;
                Tegud.Mapping.Hide();
            });
        });

    Tegud.Twitter.Load();
}

Tegud.Twitter.Load = function() {
    var twitterDiv = $("#TwitterDiv");
    var twitterDivHeight = twitterDiv.height();
    var twitterDivWidth = twitterDiv.width();

    var twitterLoadingDiv = $("<div id=\"TwitterLoading\"><img src=\"/Content/Assets/wait_2.gif\" /></div>");
    var loadingImage = twitterLoadingDiv.children("img");

    twitterDiv.append(twitterLoadingDiv);

    twitterLoadingDiv.css({
        height: twitterDivHeight,
        width: twitterDiv.width() - 10,
        opacity: 0.8,
        position: "absolute"
    });

    loadingImage.css({
        "marginLeft": ((twitterDivWidth - loadingImage.width()) / 2),
        "marginTop": ((twitterDivHeight - 30) / 2)
    });

    $.YQL("select * from twitter.user.timeline where id='Tegud'",
                function (data) {
                    $("#TwitterLoading").remove();

                    var w = data.query.results.statuses;

                    if (w && w.status && w.status.length > 0)
                        Tegud.Twitter.Setup(w.status);
                    else
                        $('#TwitterWidget')
                            .html("Cant contact twitter.")
                            .removeData("twitterPosts");
                });
}


Tegud.Twitter.Setup = function (twitterHistory) {
    if (!twitterHistory.length)
        return;

    var userInfo = twitterHistory[0].user;

    var twitterListHtml = "";

    for (var x = 0; x < twitterHistory.length; x++) {
        twitterListHtml += "<div class=\"TwitterHistoryItem\">"
            + (twitterHistory[x].geo ? "<div class=\"TwitterGeoMarker\"></div>" : "")
            + "<div class=\"DateHeader\">"
            + Tegud.Utilities.PrettyDate(twitterHistory[x].created_at.replace("+", "UTC+")) + "</div>"
            + Tegud.Twitter.AddLink(twitterHistory[x].text)
            + "</div>"
    }

    var html = "<div>";
    if (userInfo.profile_image_url != "")
        html += "<div style=\"float: left; padding-left: 8px; padding-right: 5px;\"><a href=\"http://www.twitter.com/tegud\"><img src=\"" + userInfo.profile_image_url + "\" id=\"TwitterProfilePic\" style=\"border: 0px;\"/></a></div>";
    html += "<div style=\"overflow: hidden; height: 90px;\" id=\"TwitterHistoryContent\">" + twitterListHtml + "<div style=\"height: 100px;\"></div></div></div>";

    $('#TwitterWidget').html(html);

    $("#TwitterHistoryContent")
        .data("CurrentIndex", 0)
        .data("Posts", twitterHistory)
        .children(":first")
            .css({ opacity: 1 })
            .siblings()
                .animate({ opacity: 0.5 }, 500);
}


Tegud.Twitter.HistoryGotoFirst = function () {
    Tegud.Twitter.HistoryShift((-$("#TwitterHistoryContent").data("CurrentIndex")) || 0);
}

Tegud.Twitter.HistoryShift = function (shiftBy) {
    var twitterContent = $("#TwitterHistoryContent");
    var index = twitterContent.data("CurrentIndex") || 0;

    index += shiftBy;

    if (index < 0)
        index = 0;

    var historyItems = twitterContent.children(".TwitterHistoryItem");

    if (index > historyItems.size() - 1)
        index = historyItems.size() - 1;

    if (twitterContent.data("CurrentIndex") == index)
        return;

    var item = historyItems.filter(":eq(" + index + ")");
    var previousItems = item.prevAll();
    var newScrollTop = 0;

    previousItems.each(function () {
        newScrollTop += $(this).outerHeight() + 10;
    });

    item
        .animate({ opacity: 1 }, 500)
        .siblings()
            .animate({ opacity: 0.5 }, 500);

    twitterContent.animate({ scrollTop: newScrollTop }, 750, "easeOutBounce");

    twitterContent.data("CurrentIndex", index);
}

Tegud.Twitter.FindLink = function (links, relString) {
    if (!links)
        return;

    var foundImageObject;
    for (var x = 0; x < links.length; x++) {
        if (links[x].rel == relString) {
            foundImageObject = links[x];
            break;
        }
    }

    return foundImageObject == undefined ? "" : foundImageObject.href;
}

Tegud.Twitter.AddLink = function (tweet) {
    tweet = tweet.replace(/\b(?:https?:\/\/|www\.)\S+\b/g, function (m) { return Tegud.Twitter.CreateLink(m, "", ""); });
    tweet = tweet.replace(/(?:@)([a-zA-Z0-9_]*)/g, function (m) { return Tegud.Twitter.CreateLink(m, "http://www.twitter.com/", "@"); });
    tweet = tweet.replace(/(?:#)([a-zA-Z0-9_]*)/g, function (m) { return Tegud.Twitter.CreateLink(m, "http://search.twitter.com/search?q=%23", "#"); });

    return tweet;
}

Tegud.Twitter.CreateLink = function (match, prefix, removeFromLink) {
    return "<a href=\"" + prefix + match.replace(removeFromLink, "") + "\">" + match + "</a>";
}
