﻿App.module("profile", function (exports, require) {

    var App = require("app");
    var Utils = require("utils");
    var $ = require("jQuery");

    App.addActions({
        profileSave: ProfileSaveAction,
        updateStatus: UpdateStatusAction,
        activityStreamMore: ActivityStreamMore,
        addRemoveFriend: AddRemoveFriend,
        removeFriend: RemoveFriend,
        acceptFriendRequest: AcceptFriendRequest,
        rejectFriendRequest: RejectFriendRequest,
        changePassword: changePassword,
        newsletterSubscribe: Subscribe,
        feedbackSubmit: FeedbackSubmit,
    });

    App.addAutoLoaders({
        profileForm: onProfileFormLoaded
    });

    function onProfileFormLoaded() {
        function checkCity() {
            var disabled = $(this).val() != "ZA";
            $("select[name=City]").attr('disabled', disabled ? 'disabled' : '');
            if (disabled) {
                $("select[name=City]").val(0);
            }
        }
        $("select[name=Country]")
            .change(checkCity) // add cahnge handler
            .each(checkCity); // call for initial value
    }


    function ProfileSaveAction($el) {
        var miniProfile = $(".profileMini .displayName");

        Utils.formPost({
            action: "updateProfile",
            $el: $el,
            paramName: "profile",
            success: function (response, formValues) {
                App.displayInfo(response);
                if (formValues.DisplayName != miniProfile.text())
                    miniProfile.text(formValues.DisplayName)
            }
        });
    }
    function UpdateStatusAction($el) {

        Utils.formPost({
            action: "updateStatus",
            $el: $el,
            success: function (response) {
                $(".activityStream li.no-info").fadeOut();
                //$(".activityStream").preppend(decodeURIComponent(data));
                $(decodeURIComponent(response.activityStream)).insertBefore(".activityStream li:first").fadeIn();
            }
        });
    }

    function ActivityStreamMore($el) {

        var count = $(".activityStream li").length,
            loadingIcon = $el.find(".loadingIcon");
        App.post("activityStreamMore", { visibleCount: count, userId: $el.attr("data-userid") }, function (err, data) {
            loadingIcon.hide();
            if (err) return App.displayError(err, $el.closest(".error-message"));
            if (data == "")
                $el.hide();
            else
                $(".activityStream").append(decodeURIComponent(data));
        });
    }

    // TODO: clean up friending, these next few methods are very similar and can be merged, but i dont have time now :(

    function AddRemoveFriend($el) {

        var loadingIcon = $el.find(".loadingIcon"),
            action = $el.is(".removeFriend") ? "remove" : "add";

        App.post("addRemoveFriend", { action: action, userId: $el.attr("data-userid") }, function (err, data) {
            loadingIcon.hide();
            if (err) return App.displayError(err, $el.find(".error-message"));
            App.displayInfo(data);
            if (action == "add") {
                $el.removeClass("addFriend").addClass("removeFriend");
                $el.hide();
            } else {
                $el.removeClass("removeFriend").addClass("addFriend");
            }

            App.trackGoogleEvent(["profile actions", "request friend"]);
        });
    }

    function RemoveFriend($el) {
        var loadingIcon = $el.find(".loadingIcon");
        App.post("addRemoveFriend", { action: 'remove', userId: $el.attr("data-userid") }, function (err, data) {
            loadingIcon.hide();
            if (err) return App.displayError(err, $el.find(".error-message"));
            App.displayInfo(data);

            var bc = $(".buddy-count");
            bc.text((parseInt(bc.text()) || 0) - 1);
            $el.closest("li").remove();

            App.trackGoogleEvent(["profile actions", "remove friend"]);
            //TODO: show no info if friends.count == 0
        });
    }


    function AcceptFriendRequest($el) {
        App.post("addRemoveFriend", { action: 'add', userId: $el.attr("data-userid") }, function (err, data) {
            if (err) return App.displayError(err, $el.find(".error-message"));

            var bc = $(".buddy-count"),
                brc = $(".buddy-request-count"),
                reqCount = (parseInt(brc.text()) || 0) - 1;

            bc.text((parseInt(bc.text()) || 0) + 1);
            if (reqCount < 1)
                brc.closest(".sidebar-item").fadeOut();
            else
                brc.text(reqCount);

            var li = $el.closest("li"),
                user = li.find(".user")[0];
            li.remove();

            $(".mybuddies").prepend(decodeURIComponent(data.buddyList));
            $(".activityStream").prepend(decodeURIComponent(data.activityStream));

            App.displayInfo(decodeURIComponent(data.message));

            $(".mybuddies").siblings(".no-info").hide();

            App.trackGoogleEvent(["profile actions", "accept friend"]);
        });
    }

    function RejectFriendRequest($el) {
        App.post("addRemoveFriend", { action: 'remove', userId: $el.attr("data-userid") }, function (err, data) {
            if (err) return App.displayError(err, $el.find(".error-message"));
            App.displayInfo(data);


            var brc = $(".buddy-request-count"),
                reqCount = (parseInt(brc.text()) || 0) - 1;
            if (reqCount < 1)
                brc.closest(".sidebar-item").fadeOut();
            else
                brc.text(reqCount);

            $el.closest("li").remove();

            App.trackGoogleEvent(["profile actions", "reject friend"]);
        });
    }


    function changePassword($el) {
        Utils.formPost('changePassword', $el, function (data) {
            App.closeOverlay();
            App.displayInfo(data);
        });
    }

     function Subscribe($el) {
        Utils.formPost('RegisterForNewsLetter',$el , function (data) {
            App.displayInfo(data.msg);
             $('.contentcontainer').hide();
             $('.successmsg').show();
        }); 
    }

    function FeedbackSubmit($el) {
        if ($('[name=username]').val() != "") {
            Utils.formPost('FeedbackSubmit', $el, function (data) {
                App.displayInfo(data.msg);
                $('.contentcontainer').hide();
                $('.failmsg').show();
            });
        }
    }
});
