﻿/// <reference path="json2.js" />
/// <reference path="jquery-1.4.1.js" />
/// <reference path="jquery.cookies.js" />
/// <reference path="jquery.selectboxes.pack.js" />

var ajaxSettings = function() {
}



$(document).ready(function() {

    function rankingCallback(prefix, data) {
        var percentile = parseInt(((data.totalUsers - data.rank) / data.totalUsers) * 100);
        $("#" + prefix + "-ranking").attr('title', 'ranking ' + data.rank + " of " + data.totalUsers).html(" top " + (100 - percentile) + "%");
    }

    function flairCallback(prefix, data) {
        $("#" + prefix + "-reputation-score").html(data.reputation);
        $("#" + prefix + "-badges").html(data.badgeHtml);
        $("#" + prefix + "-gravatar").attr("href", data.profileUrl).html(data.gravatarHtml);
        $("#" + prefix + "-display-name").attr("href", data.profileUrl).html(data.displayName);
    };

    window.buildFlairContainer = function(container, prefix, title, site, userId) {
        var template =
                    '<div class="valuable-flair">'
                    + '    <div class="gravatar"><a id="~p~-gravatar" title="See my profile on ~t~" target="_blank"></a></div>'
                    + '    <div class="userInfo">'
                    + '        <span class="username" title="See my profile on ~t~">'
                    + '            <img src="http://sstatic.net/~p~/favicon.ico" alt="" />'
                    + '            <a id="~p~-display-name" target="_blank">&nbsp;</a></span>'
                    + '        <br />'
                    + '        <span id="~p~-reputation-score" title="reputation score">&nbsp;</span>'
                    + '        &nbsp;&#9679;&nbsp;<span id="~p~-ranking">&nbsp;</span>'
                    + '        <br />'
                    + '        <div id="~p~-badges">&nbsp;</div>'
                    + '    </div>'
                    + '</div>';
        $(container).append(template.replace(/~p~/g, prefix).replace(/~t~/g, title));
        $.getJSON("http://" + site + "/users/flair/" + userId + ".json?callback=?",
                function(data) {
                    flairCallback(prefix, data);
                });
        $.getJSON("http://skysanders.net/tools/sorep/SEStats.ashx?site=" + site + "&userId=" + userId + "&callback=?",
                    function(data) {
                        rankingCallback(prefix, data);
                    });
    }


    buildFlairContainer("#flair", "so", "StackOverflow", "stackoverflow.com", 1);
    buildFlairContainer("#flair", "mso", "Meta StackOverflow", "meta.stackoverflow.com", 1);
    buildFlairContainer("#flair", "sf", "ServerFault", "serverfault.com", 1);
    buildFlairContainer("#flair", "su", "SuperUser", "superuser.com", 1);

});

window.seStats = (function(window, undefined) {

    var seStats = {
        cookieName: "seuserdata",
        userData: { UserIds: {} },
        setUserData: setUserData

    };

    function DateAdd(ItemType, DateToWorkOn, ValueToBeAdded) {
        //http://www.vbknowledgebase.com/?Id=80&Desc=Javascript-Date-functions-for-VB-DateDiff-DateAdd
        switch (ItemType) {
            //date portion                                 
            case 'd': //add days
                DateToWorkOn.setDate(DateToWorkOn.getDate() + ValueToBeAdded)
                break;
            case 'm': //add months
                DateToWorkOn.setMonth(DateToWorkOn.getMonth() + ValueToBeAdded)
                break;
            case 'y': //add years
                DateToWorkOn.setYear(DateToWorkOn.getFullYear() + ValueToBeAdded)
                break;
            //time portion                                 
            case 'h': //add days
                DateToWorkOn.setHours(DateToWorkOn.getHours() + ValueToBeAdded)
                break;
            case 'n': //add minutes
                DateToWorkOn.setMinutes(DateToWorkOn.getMinutes() + ValueToBeAdded)
                break;
            case 's': //add seconds
                DateToWorkOn.setSeconds(DateToWorkOn.getSeconds() + ValueToBeAdded)
                break;
        }
        return DateToWorkOn;
    };

    function getUserData() {
        var cookieValue = $.cookie(seStats.cookieName);
        if (cookieValue) {
            seStats.userData = JSON.parse(decodeURIComponent(cookieValue));
        }
    }
    function setUserData() {
        var cookieVal = encodeURIComponent(JSON.stringify(seStats.userData));
        $.cookie(seStats.cookieName, cookieVal, new $.cookie.Options(DateAdd("m", new Date(), 1)));
    }

    function updateUI(sites) {
        seStats.sites = sites;
        $("#SiteIdDropDownList").addOption('', 'Select Site');

        $.each(sites, function(index, value) {
            $("<div class='updateTime'/>").html(value.name + " updated " + value.updated).appendTo($("#updateTimes"));
            $("#SiteIdDropDownList").addOption(index, value.name);
        });

        $("#SiteIdDropDownList").change(function() {
            var siteId = $(this).val();
            var userId = seStats.userData.UserIds[siteId];
            $("#UserIdTextBox").val(userId ? userId : "");
        });

        var userId = $.query.get("userId");
        // validate this site
        var site = $.query.get("site").toLowerCase();
        var validSite = false;
        $.each(sites, function(index, value) {
            if (value.name.toLowerCase() == site) {
                $("#SiteIdDropDownList").selectOptions(index, true);
                validSite = true;
            }
        });

        if (!isNaN(userId) && validSite) {

            $("#UserIdTextBox").val(userId);
            window.setTimeout(function() { $("#GetStatsButton").click(); }, 10);

        }
        else {
            $("#SiteIdDropDownList option:eq(0)").attr("selected", "selected");
        }
    }
    function getSites() {
        var settings = new ajaxSettings();

        settings.url = "default.aspx/GetSites";
        settings.contentType = "application/json; charset=utf-8";
        settings.dataType = "json";
        settings.data = "{}";
        settings.type = "POST";
        settings.success = function(data) {
            updateUI(data.d);
        }

        $.ajax(settings);

    };

    getUserData();
    getSites();


    $(document).ready(function() {

        $("#GetStatsButton").click(function() {

            // clear results
            $("#results").empty();

            // clear errors
            var hasError = false;


            $("#error_site").html("");
            $("#error_userId").html("");
            $("#error_main").html("");

            var siteId = $("#SiteIdDropDownList").val();
            if (!siteId) {
                hasError = true;
                $("#error_site").html("Please select a site.");
            }

            var site = $("#SiteIdDropDownList").children("option:selected").text();

            var userId = parseInt($("#UserIdTextBox").val());

            if (!userId || isNaN(userId)) {
                hasError = true;
                $("#error_userId").html("Please enter an userId number.");
            }



            if (!hasError) {
                var settings = new ajaxSettings();
                settings.type = "GET";
                settings.dataType = "json";
                settings.url = "SEStats.ashx";
                settings.data = { site: site, userId: userId };
                settings.success = function(data) {
                    seStats.userData.UserIds[siteId] = userId;
                    seStats.setUserData();
                    $("#results").append($("#results-template").jqote(data, "*"));

                    buildFlairContainer("#resultsFlair", seStats.sites[siteId].key, seStats.sites[siteId].title, seStats.sites[siteId].name, userId);
                    $("#ranked-flair").show();
                };
                settings.error = function(xhr, status, error) {
                    var errMessage = "There was an error processing your request.";
                    switch (xhr.statusText.toLowerCase()) {
                        case "not found":
                            errMessage = "User does not exist or is not indexed.";
                            break;
                        case "bad request":
                            errMessage = "There was an error processing your request.";
                            break;
                    }
                    $("#error_main").html(errMessage);
                };
                $.ajax(settings);
            }
        });

    });


    return seStats;
})(window);





