﻿Type.registerNamespace('ONE.Behaviors');

ONE.Behaviors.Pluck = function(element) {
    ONE.Behaviors.Pluck.initializeBase(this, [element]);

    this._pluckItems = null;
    this._serverUrl = null;
    this._recommendLink = null;
    this._updateArticle = false;
    this._recommendClickDelegate = null;
    this._onRequestCompleteDelegate = null;
    this._onRequestErrorDelegate = null;
    this._onRecommendCompleteDelegate = null;
    this._onRecommendErrorDelegate = null;
    this._onAddArticleCompleteDelegate = null;
    this._onAddArticleErrorDelegate = null;
}

ONE.Behaviors.Pluck.prototype = {
    initialize: function() {
        ONE.Behaviors.Pluck.callBaseMethod(this, 'initialize');
        if (this._pluckItems && this._pluckItems.length > 0) {
            this._onRequestCompleteDelegate = Function.createDelegate(this, this._onRequestComplete);
            this._onRequestErrorDelegate = Function.createDelegate(this, this._onRequestError);
            this._onRecommendCompleteDelegate = Function.createDelegate(this, this._onRecommendComplete);
            this._onRecommendErrorDelegate = Function.createDelegate(this, this._onRecommendError);
            this._onAddArticleCompleteDelegate = Function.createDelegate(this, this._onAddArticleComplete);
            this._onAddArticleErrorDelegate = Function.createDelegate(this, this._onAddArticleError);
            this._getPluckData();
            this._setRecommendationLinks();
        }
    },

    dispose: function() {
        if (this._recommendLink && this._recommendClickDelegate) {
            $removeHandler(this._recommendLink[0], "click", this._recommendClickDelegate);
        }
        this._serverUrl = null;
        this._recommendLink = null;
        this._recommendClickDelegate = null;
        this._profileItems = null;
        this._onRequestCompleteDelegate = null;
        this._onRequestErrorDelegate = null;
        this._onRecommendCompleteDelegate = null;
        this._onRecommendErrorDelegate = null;
        this._onAddArticleCompleteDelegate = null;
        this._onAddArticleErrorDelegate = null;
        ONE.Behaviors.Pluck.callBaseMethod(this, 'dispose');
    },

    _getPluckData: function() {
        var requestBatch = new RequestBatch();
        for (var i = 0; i < this._pluckItems.length; i++) {
            requestBatch.AddToRequest(new ArticleKey(this._pluckItems[i].Id));
        }
        requestBatch.BeginRequest(this._serverUrl, this._onRequestCompleteDelegate, this._onRequestErrorDelegate);
    },

    _onRequestComplete: function(results) {
        var pluckItem = null;
        var requestBatch = new RequestBatch();
        this._processMissingArticles(results);
        for (var i = 0; i < this._pluckItems.length; i++) {
            var resultItem = null;
            for (var j = 0; j < results.Responses.length; j++) {
                if (results.Responses[j].Article.ArticleKey.Key == this._pluckItems[i].Id) {
                    resultItem = results.Responses[j];
                    pluckItem = this._pluckItems[i];
                    if (this._remoteItemRequiresUpdate(resultItem, pluckItem)) {
                        requestBatch.AddToRequest(this._getUpdateArticleAction(pluckItem));
                    }
                    break;
                }
            }
            if (resultItem != null) {
                this._processResult(this._pluckItems[i].ContainerId, resultItem);
            }
        }
        if (requestBatch.Requests.length > 0) {
            requestBatch.BeginRequest(this._serverUrl, this._onAddArticleCompleteDelegate, this._onAddArticleErrorDelegate);
        }
    },

    _remoteItemRequiresUpdate: function(resultItem, pluckItem) {
        return (this._updateArticle
            && (resultItem.Article.PageTitle != pluckItem.Title
            || resultItem.Article.PageUrl != pluckItem.PageUrl));
    },

    _onRecommendClick: function(evt) {
        evt.stopPropagation();
        evt.preventDefault();
        var contentId = this.get_ContentId(evt.target);
        var requestBatch = new RequestBatch();
        requestBatch.AddToRequest(new RecommendAction(new ArticleKey(contentId)));
        requestBatch.BeginRequest(this._serverUrl, this._onRecommendCompleteDelegate, this._onRecommendErrorDelegate);
    },

    _processMissingArticles: function(results) {
        var requestBatch = new RequestBatch();
        for (var i = 0; i < results.Messages.length; i++) {
            var articleKeyLength = 40;
            var keyString = "ArticleKey = [";
            var pos = results.Messages[i].Message.indexOf(keyString);
            if (pos != -1) {
                var articleKey = results.Messages[i].Message.substr(pos + keyString.length, articleKeyLength);
                var pluckItem = this._findPluckItem(articleKey);
                if (pluckItem != null) {
                    requestBatch.AddToRequest(this._getUpdateArticleAction(pluckItem));
                }
            }
        }
        if (requestBatch.Requests.length > 0) {
            requestBatch.BeginRequest(this._serverUrl, this._onAddArticleCompleteDelegate, this._onAddArticleErrorDelegate);
        }
    },

    _findPluckItem: function(articleKey) {
        for (var i = 0; i < this._pluckItems.length; i++) {
            if (this._pluckItems[i].Id == articleKey) {
                return this._pluckItems[i];
            }
        }
        return null;
    },

    _getUpdateArticleAction: function(pluckItem) {
        var categories = new Array();
        for (var j = 0; j < pluckItem.Taxonomies.length; j++) {
            categories[j] = new Category(pluckItem.Taxonomies[j]);
        }
        var section = new Section(pluckItem.ContentType);
        var updateArticleAction = new UpdateArticleAction(new ArticleKey(pluckItem.Id), pluckItem.PageUrl, pluckItem.Title, section, categories);
        return updateArticleAction;
    },

    _processResult: function(containerId, result) {
        var container = this.get_Container(containerId);

        var commentCount = result.Article.Comments.NumberOfComments;
        var elt = this.get_CommentElement(container);
        $(elt).html(commentCount);

        var recommendationCount = result.Article.Recommendations.NumberOfRecommendations;
        var elt = this.get_RecommendElement(container);
        $(elt).html(recommendationCount);

        var hasRecommeded = (result.Article.Recommendations.CurrentUserHasRecommended.toLowerCase() == 'true');
        if (hasRecommeded) {
            this.get_RecommendLink(container).hide();
            this.get_RecommendSpan(container).show();
        }
    },

    _setRecommendationLinks: function() {
        for (var i = 0; i < this._pluckItems.length; i++) {
            var container = this.get_Container(this._pluckItems[i].ContainerId);
            var recommendLink = this.get_RecommendLink(container);
            if (recommendLink.length > 0) {
                this._recommendClickDelegate = Function.createDelegate(this, this._onRecommendClick);
                $addHandler(recommendLink[0], "click", this._recommendClickDelegate);
            }
        }
    },

    get_ContentId: function(elt) {
        for (var i = 0; i < this._pluckItems.length; i++) {
            var container = $(elt).closest("#" + this._pluckItems[i].ContainerId);
            if (container.length) {
                return this._pluckItems[i].Id;
            }
        }
        return;
    },

    _onRequestError: function(results) {

    },

    _onRecommendComplete: function(results) {
        this._getPluckData();
    },

    _onRecommendError: function(results) {

    },

    _onAddArticleComplete: function(results) {

    },

    _onAddArticleError: function(results) {

    },

    get_CommentElement: function(container) {
        return container.find(".commentCount");
    },

    get_RecommendElement: function(container) {
        return container.find(".recommendCount");
    },

    get_Container: function(containerId) {
        return $("#" + containerId).eq(0); ;
    },

    get_RecommendLink: function(container) {
        return container.find("a.recommend");
    },

    get_RecommendSpan: function(container) {
        return container.find(".recommendInactive");
    },

    get_UpdateArticle: function() {
        return this._updateArticle;
    },

    set_UpdateArticle: function(val) {
        this._updateArticle = val;
    },

    get_ServerUrl: function() {
        return this._serverUrl;
    },

    set_ServerUrl: function(val) {
        this._serverUrl = val;
    },

    get_PluckItems: function() {
        return this._pluckItems;
    },

    set_PluckItems: function(val) {
        this._pluckItems = Sys.Serialization.JavaScriptSerializer.deserialize(val);
    }
}

ONE.Behaviors.Pluck.registerClass('ONE.Behaviors.Pluck', AjaxControlToolkit.BehaviorBase);
if (typeof (Sys) !== 'undefined') { Sys.Application.notifyScriptLoaded(); }
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();