var requiredWidgets = {};

var mostCommented = {
	'activityType'	: PluckSDK.DiscoveryActivity.Commented,
	'contentType'	: PluckSDK.ContentType.Article,
	'returnCount'	: 5,
	'age'			: 15,
	'section'		: '',
	'categories'	: [],
	'renderCategory': false,
	'renderCount'	: true,
	'parentId'		: 'mostCommented',
	'titleLimit'	: 60,
	'callback'		: function(response) {
		var renderHtml = "";
		for (var i=0; i < response.length; i++) {
			renderHtml += createResultRowHtml(i + 1, response[i], fmtActivityName(response[i].Activity), response[i].Comments.NumberOfTopLevelComments, this.renderCount, fmtCategoryName(response[i].Category), this.renderCategory, position(i,response.length),this.titleLimit);
		}
		$("#"+this.parentId).html(renderHtml);
	}
};

var mostRecommended = {
	'activityType'	: PluckSDK.DiscoveryActivity.Recommended,
	'contentType'	: PluckSDK.ContentType.Article,
	'returnCount'	: 5,
	'age'			: 15,
	'section'		: '',
	'categories'	: [],
	'renderCategory': false,
	'renderCount'	: false,
	'parentId'		: 'mostRecommended',
	'titleLimit'	: 60,
	'callback'		: function(response) {
		var renderHtml = "";
		for (var i=0; i < response.length; i++) {
			renderHtml += createResultRowHtml(i + 1, response[i], fmtActivityName(response[i].Activity), response[i].Recommendations.NumberOfRecommendations, this.renderCount, fmtCategoryName(response[i].Category), this.renderCategory, position(i,response.length),this.titleLimit);
		}
		$("#"+this.parentId).html(renderHtml);
	}
};

var mostViewed = {
	'activityType'	: PluckSDK.DiscoveryActivity.MostViewed,
	'contentType'	: PluckSDK.ContentType.Article,
	'returnCount'	: 5,
	'age'			: 15,
	'section'		: '',
	'categories'	: [],
	'renderCategory': false,
	'renderCount'	: false,
	'parentId'		: 'mostViewed',
	'titleLimit'	: 60,
	'callback'		: function(response) {
		var renderHtml = "";
		for (var i=0; i < response.length; i++) {
			renderHtml += createResultRowHtml(i + 1, response[i], fmtActivityName(response[i].Activity), response[i].ViewTrackingCounts.TotalViews, this.renderCount, fmtCategoryName(response[i].Category), this.renderCategory, position(i,response.length),this.titleLimit);
		}
		$("#"+this.parentId).html(renderHtml);
	}
};

function fmtCategoryName(category) {
	var nameArr = category.split('/');
	name = (nameArr[nameArr.length-1]);
	return name.replace("-", " ");
}

function fmtActivityName(activity) {
	switch(activity) {
	case 'Commented':
		return 'Comment';
		break;
	case 'Recommended':
	  	return 'Recommend';
	  	break;
	case 'MostViewed':
	  	return 'View';
	  	break;
	}
}

function createResultRowHtml(index, response, activity, count, showCount, category, showCategory, position,titleLimit) {
	var title = response.Title;
	if (titleLimit != 0) {
		title = limitText(title,titleLimit);
	}
	var url = response.Url;

	var className = 'odd';
	if (index % 2 == 1) {className = 'even';}

	var html = "<li class='topBorder " + className + " listItem" + index + " " + position + "'><div class='listContainer'>";
	html += "<a href=\"" + url + "\">" + (title != "" ? title : "Unknown title");
	html += "</a><span class='discoveryMeta'>";
	if (showCount) {
		html += "<span class='noOf"+ activity +"s'>(" + count + " " + activity + (count > 1 ? "s": "") + ")</span>";
	}
	if (showCategory) {
		html += "<span class='categoryName'>"+ category +"</span>";
	}
	html += "</span></div></li>";
	
	return html;
}

function discoverContent() {
	var requests = [];
	for (var i=0; i < requiredWidgets.length; i++ ){
		var catCount = requiredWidgets[i].categories.length;
		if (catCount > 0) {
			for (var j=0; j < catCount; j++ ) {
				var pluckDiscoRequest = createPluckDiscoRequest(requiredWidgets[i]);
				
				if (requiredWidgets[i].section != ''){
					pluckDiscoRequest.Sections = [];
					pluckDiscoRequest.Sections.push( new PluckSDK.DiscoverySection( {Name:requiredWidgets[i].section} ) );
				}
	
				pluckDiscoRequest.Categories = [];
				if (requiredWidgets[i].categories.length > 0) { 
					pluckDiscoRequest.Categories.push( new PluckSDK.DiscoveryCategory( {Name: requiredWidgets[i].categories[j]} ) );
				}
				
				requests.push(pluckDiscoRequest);
			}
		} else {
			requests.push(createPluckDiscoRequest(requiredWidgets[i]));
		}
	}
	PluckSDK.SendRequests(requests, discoverContentCallback);
}

function createPluckDiscoRequest(requiredWidgets) {
	var pluckDiscoRequest = new PluckSDK.DiscoverContentActionRequest();
   	pluckDiscoRequest.Activity = requiredWidgets.activityType; 
   	pluckDiscoRequest.Type = requiredWidgets.contentType;    	
   	pluckDiscoRequest.Age = requiredWidgets.age;
	pluckDiscoRequest.MaximumNumberOfDiscoveries = requiredWidgets.returnCount;
	pluckDiscoRequest.FilterBySiteOfOrigin = true;
	return pluckDiscoRequest;
}

function discoverContentCallback(responses) {
	if (responses[0].ResponseStatus.StatusCode == PluckSDK.ResponseStatusCode.OK) {
		var mostRecommendedArr = [];
		var mostCommentedArr = [];
		var mostViewedArr = [];
		for (var i = 0; i < responses.length; i++) {
		
			if (responses[i].Activity == "Recommended") {
				for (var j=0; j < responses[i].DiscoveredContent.length; j++) {
					var discoObj = {
						'articleId'			: responses[i].DiscoveredContent[j].ArticleKey.Key,
						'count'				: responses[i].DiscoveredContent[j].Recommendations.NumberOfRecommendations,
						'Recommendations'	: {'NumberOfRecommendations' : responses[i].DiscoveredContent[j].Recommendations.NumberOfRecommendations},
						'Title'				: responses[i].DiscoveredContent[j].Title,
						'Url'				: responses[i].DiscoveredContent[j].Url,
						'Category'			: (responses[i].DiscoveredContent[j].Categories.length > 0 ? responses[i].DiscoveredContent[j].Categories[0].Name : ""),
						'Activity'			: responses[i].Activity
					}
					if (!inArr(mostRecommendedArr,responses[i].DiscoveredContent[j].ArticleKey.Key)) {
						mostRecommendedArr.push(discoObj);
					}
				}
			}
			if (responses[i].Activity == "Commented") {
				for (var j=0; j < responses[i].DiscoveredContent.length; j++) {
					var discoObj = {
						'articleId'			: responses[i].DiscoveredContent[j].ArticleKey.Key,
						'count'				: responses[i].DiscoveredContent[j].Comments.NumberOfTopLevelComments,
						'Comments'			: {'NumberOfTopLevelComments' : responses[i].DiscoveredContent[j].Comments.NumberOfTopLevelComments},
						'Title'				: responses[i].DiscoveredContent[j].Title,
						'Url'				: responses[i].DiscoveredContent[j].Url,
						'Category'			: (responses[i].DiscoveredContent[j].Categories.length > 0 ? responses[i].DiscoveredContent[j].Categories[0].Name : ""),
						'Activity'			: responses[i].Activity
					}
					if (!inArr(mostCommentedArr,responses[i].DiscoveredContent[j].ArticleKey.Key)) {
						mostCommentedArr.push(discoObj);
					}
				}
			}
			if (responses[i].Activity == "MostViewed") {
				for (var j=0; j < responses[i].DiscoveredContent.length; j++) {
					var discoObj = {
						'articleId'			: responses[i].DiscoveredContent[j].ArticleKey.Key,
						'count'				: responses[i].DiscoveredContent[j].ViewTrackingCounts.TotalViews,
						'ViewTrackingCounts': {'TotalViews' : responses[i].DiscoveredContent[j].ViewTrackingCounts.TotalViews},
						'Title'				: responses[i].DiscoveredContent[j].Title,
						'Url'				: responses[i].DiscoveredContent[j].Url,
						'Category'			: (responses[i].DiscoveredContent[j].Categories.length > 0 ? responses[i].DiscoveredContent[j].Categories[0].Name : ""),
						'Activity'			: responses[i].Activity
					}
					if (!inArr(mostViewedArr,responses[i].DiscoveredContent[j].ArticleKey.Key)) {
						mostViewedArr.push(discoObj);
					}
				}
			}
		}
		executeDiscoCallback(mostRecommendedArr, mostRecommended);
		executeDiscoCallback(mostCommentedArr, mostCommented);
		executeDiscoCallback(mostViewedArr, mostViewed);
	} else {
		showError("Pluck data retrieval error", "discoverContentCallback() - Response from Pluck DiscoverContentActionRequest was:<br/>" 
						+ convertPluckExceptionToString(responses[0].ResponseStatus));
	}
}

function discoSort(a,b) {
	return((a.count > b.count) ? -1 : 1);
}

function executeDiscoCallback(inputArray, activityType) {
	if (inputArray.length > 0) {
		inputArray.sort(discoSort);
		if (inputArray.length > activityType.returnCount) {
			inputArray.length = activityType.returnCount;
		}
		activityType.callback(inputArray);
	}
}

function inArr(inputArray,searchItem) {
	var result = false;
	for (var k=0; k < inputArray.length; k++) {
		if (inputArray[k].articleId == searchItem) {
			result = true;
			break;
		}
	}
	return result;
}


function logPageView(articleId) {
	var articleRequest = new PluckSDK.ArticleRequest(); 
    articleRequest.ArticleKey = new PluckSDK.ExternalResourceKey( {Key: articleId} ); 
    articleRequest.ViewTrackRequest = true; 
    var requests = [];
    requests.push(articleRequest); 
    PluckSDK.SendRequests(requests, logPageViewCallback); 
}

function logPageViewCallback(responses) {
	if (responses[0].ResponseStatus.StatusCode != PluckSDK.ResponseStatusCode.OK) { 
        /* James to resolve
        if (itemNotFound(responses[0]) ) {
        	showError("Article does not exist in the Pluck database");
        } else {
        	showError("Pluck data retrieval error", "Response from Pluck RecommendActionRequest was " 
							+ convertPluckExceptionToString(responses[0].ResponseStatus));
        } 
        */
    }
}

function showArticlePageCounts(articleId, title, section, categories) {

	var articleKey = new PluckSDK.ExternalResourceKey( {Key: articleId} ); 
	var articleUpdate = new PluckSDK.UpdateArticleActionRequest(); 
    articleUpdate.ArticleKey = articleKey; 
    articleUpdate.OnPageTitle = title; 
    articleUpdate.OnPageUrl = location.href;
    
    if (section != ''){
		articleUpdate.Section = new PluckSDK.DiscoverySection( {Name: section} ) 
	}
	
	if (categories != null && categories != ''){
		categories = categories.split(",");
		articleUpdate.Categories = [];
		for (var j=0; j < categories.length; j++ ){
			if (categories[j] != "") {
				articleUpdate.Categories.push( new PluckSDK.DiscoveryCategory( {Name: categories[j]} ) );
			}
		}
	}
    
	var articleInfo = new PluckSDK.ArticleRequest(); 
	articleInfo.ArticleKey = articleKey;
	
	PluckSDK.SendRequests([articleUpdate, articleInfo], showArticlePageCountsCallback);
}

function showArticlePageCountsCallback(responses) {

	var articleUpdate = responses[0];
	var articleInfo = responses[1];

	if (articleUpdate.ResponseStatus.StatusCode == PluckSDK.ResponseStatusCode.OK) {
		if (articleInfo.ResponseStatus.StatusCode == PluckSDK.ResponseStatusCode.OK) {
			var recommendCount = articleInfo.Article.Recommendations.NumberOfRecommendations;
			var commentCount = articleInfo.Article.Comments.NumberOfTopLevelComments;
			$(".recommendCount").html(recommendCount);
			$(".commentCount").html(commentCount);
			if (articleInfo.Article.Recommendations.CurrentUserHasRecommended) {
				$(".recommendText").html("<span class='share'><span class='shareCount'>" + recommendCount + "</span> Recommended</span>");
			} else {
				$(".recommendText").html("<a class='share' id='" + articleInfo.Article.ArticleKey.Key + 
								"' href='javascript://;' onclick='recommendArticle(this);'>Recommend <span class='shareCount'>" + recommendCount + "</span></a>");
			}
		} else {
			showError("Pluck data retrieval error", "Response from Pluck ArticleRequest was:<br/>" 
								+ convertPluckExceptionToString(articleInfo.ResponseStatus));
		}	
	} else {
		showError("Pluck data retrieval error", "Response from Pluck UpdateArticleActionRequest was " 
							+ convertPluckExceptionToString(articleUpdate.ResponseStatus));
	}
}

function recommendArticle(articleKey) {
	var articleKey = new PluckSDK.ExternalResourceKey( {Key: articleKey.id } ); 
	var action = new PluckSDK.RecommendActionRequest(); 
	action.RecommendedKey = articleKey;
	var check = new PluckSDK.ArticleRequest(); 
	check.ArticleKey = articleKey;
	var requests = [];
	requests.push(action);
	requests.push(check);
	PluckSDK.SendRequests(requests, recommendArticleCallback);
}

function recommendArticleCallback(responses) {
	if (responses[0].ResponseStatus.StatusCode == PluckSDK.ResponseStatusCode.OK) {
		var article = responses[1].Article.ArticleKey.Key;
		var recommendCount = responses[1].Article.Recommendations.NumberOfRecommendations;
		$(".recommendText").html("<span class='share'><span class='shareCount'>" + recommendCount + "</span> Recommended</span>");
	} else {
		showError("Pluck data retrieval error", "Response from Pluck RecommendActionRequest was " 
							+ convertPluckExceptionToString(responses[0].ResponseStatus));
	} 
}

function showLandingPageCounts() {
	var requests = [];
	$.each($(".socialCounts"),function() {
		if($(this).attr('id') != "") {
	    	var articleRequest = new PluckSDK.ArticleRequest(); 
	    	articleRequest.ArticleKey = new PluckSDK.ExternalResourceKey( {Key: $(this).attr('id').replace('pid-','')} );
	    	requests.push(articleRequest);
	    }
	});
	if (requests.length > 0) {
		PluckSDK.SendRequests(requests, showLandingPageCountsCallback);
	}
}

function showLandingPageCountsCallback(responses) {
	$.each(responses, function(index) {
		if (responses[index].ResponseStatus.StatusCode == PluckSDK.ResponseStatusCode.OK) {
			var recommendCount = responses[index].Article.Recommendations.NumberOfRecommendations;
			var commentCount = responses[index].Article.Comments.NumberOfTopLevelComments;
			var articleId = "pid-" + responses[index].Article.ArticleKey.Key;
			
			var output = "";

			if (commentCount > 0) {
				output = "" + commentCount + "<span class='commentTextHolder'>&nbsp;comment" + (commentCount > 1 ? "s" : "") + "</span>";
				$("#" + articleId + " .commentCount").empty().append(output);
				if (!$("#" + articleId + " .commentCount").parent().prev().hasClass('pipe1')) {
					$("#" + articleId + " .commentCount").parent().before("<span class='pipe1'>&nbsp;</span>");
				}
				showCommentCount(articleId);
			} 
			if (recommendCount > 0) {
				output = "<span class='pipe2'>&nbsp;</span>" + recommendCount + "<span class='recommendTextHolder'>&nbsp;recommendation" + (recommendCount > 1 ? "s" : "") + "</span>";
				$("#" + articleId + " .recommendCount").empty().append(output);
			}
        } else if (objectNotFoundInStorageError(responses[index].ResponseStatus)){
        	elemId = responses[index].ResponseStatus.Exceptions[0].Value;
        	showError("Pluck data retrieval error", "Pluck response " + convertPluckExceptionToString(responses[index].ResponseStatus) + " Article ID pid-" + elemId);
        }
	});
}

function convertPluckExceptionToString(response) {
	var string = "Status Code: " + response.StatusCode + "<br/>";
	for (var i = 0; i < response.Exceptions.length; i++) {
		string += "Exception " + (i + 1) + ": Level [" + response.Exceptions[i].ExceptionLevel + "] Code [" + 
						response.Exceptions[i].ExceptionCode + "]<br/>";
	}
	return string;
}

function objectNotFoundInStorageError(response) {
	for (var i = 0; i < response.Exceptions.length; i++) {
		if (response.Exceptions[i].ExceptionCode == "ObjectNotFoundInStorage") {
			return true;
		}
	}
	return false;
}

function showCommentCount(id) {
    $("#" + id + " .commentCount").show();
}

function position(i,responseLength) {
	if (i == 0) {
		return 'first';
	} else if (i == responseLength - 1) {
		return 'last';
	} else {
		return 'mid';
	}
}

function limitText(text,newLength) {
	if(text.length > newLength) {
		for(var i=newLength-3;i>=0;i--) {
			if(text.charAt(i) == " ") {
				return text.substr(0,i) + "...";
			}
		}
	}  else {
		return text;
	}
}

