var Discovery = function() {
	var $S = CBC.SETTINGS;
	var $U = CBC.UTIL;
	var $ = $U.getElementsById;
	var discoveryObjects = $S.getVal('discoveryObjects');
	var customObjects = {};

	return {
		init : function() {
			try {
				if (!discoveryObjects) return;
				this.findDiscoveryWidgets();
			} catch(e) {
				$U.debug("Error caught in: \n  file: '/includes/objects/pluck/js/discovery.js' \n  function: Discovery.init() \nError thrown is:\n" + e);
			}
		},
		findDiscoveryWidgets : function() {
			try {
				if (discoveryObjects instanceof Array) {
					for (var i=0; i<discoveryObjects.length; i++) {
						if ($(discoveryObjects[i].el)) this.formDiscoverWidget(discoveryObjects[i]);
					}
				} else {
					if ($(discoveryObjects.el)) this.formDiscoverWidget(discoveryObjects);
				}
			} catch(e) {
				$U.debug("Error caught in: \n  file: '/includes/objects/pluck/js/discovery.js' \n  function: Discovery.findDiscoveryWidgets() \nError thrown is:\n" + e);
			}
		},
		formDiscoverWidget : function(discoveryObject) {
			try {

				var el = (discoveryObject.el instanceof String) ? $(discoveryObject.el) : discoveryObject.el;
				var el_event = el.replace(/-/g,'_');
				var sections = [];
				var categories = [];
				var contributors = [];

				var widgetparams = discoveryObject.widgetParams;

				var activity = widgetparams.Activity;
				var age = widgetparams.Age;
				var maxResult = widgetparams.MaximumNumberOfDiscoveries;

				var eventName = el_event+activity+age+maxResult; //el_event+activity+age+maxResult+sections+categories+contributors

				for (var i=0; i<widgetparams.SearchSections.length; i++) {
					var s = (widgetparams.SearchSections == "" || !widgetparams.SearchSections) ? 'All' : widgetparams.SearchSections[i] ;
					sections.push(new Section(s));
					eventName += s;
				}
				for (var i=0; i<widgetparams.SearchCategories.length; i++) {
					var c = (widgetparams.SearchCategories == "" || !widgetparams.SearchCategories) ? 'All' : widgetparams.SearchCategories[i] ;
					categories.push(new Category(c));
					eventName += c;
				}
				for (var i=0; i<widgetparams.LimitToContributors.length; i++) {
					var u = (widgetparams.LimitToContributors == "" || !widgetparams.LimitToContributors) ? 'Standard' : widgetparams.LimitToContributors[i] ;
					contributors.push(new UserTier(u));
					eventName += u;
				}
				eventName = eventName.toLowerCase().replace(' ','');
				customObjects[eventName] = { updateElId: el, template: discoveryObject.template, isDiscovered: discoveryObject.isDiscovered, activity:discoveryObject.widgetParams.Activity};

				var formDiscoverWidgetRequest = function(e,o) {
					var rb = new RequestBatch();
					rb.AddToRequest(o);
					$(discoveryObject.el).innerHTML = '<dt class="loading"><img src="/includes/objects/pluck/gfx/loading-sml.gif" alt="Loading.." class="loading"/></dt>';
					rb.BeginRequest($S.getVal("serverUrl"),function(responseBatch) { CBC.APP.PLUCK.Discovery.fireUponResponse.call(CBC.APP.PLUCK.Discovery,responseBatch,el_event) });
				}

				var discoveryAction = new DiscoverArticlesAction(sections,categories,contributors,new Activity(activity),age,maxResult);

				if (discoveryObject.eventSubscriber.evt == 'load') {

					formDiscoverWidgetRequest(null,discoveryAction);
				} else {
					CBC.EVENT.addListener(discoveryObject.eventSubscriber.obj,discoveryObject.eventSubscriber.evt,formDiscoverWidgetRequest,discoveryAction);
				}

			} catch(e) {
				$U.debug("Error caught in: \n  file: '/includes/objects/pluck/js/discovery.js' \n  function: Discovery.formDiscoverWidget() \nError thrown is:\n" + e);
			}
		},
		fireUponResponse : function(_responseBatch,_el_event) {
			try {
				var eventName = '';

				if (_responseBatch.Responses) {
					var discoveryAction = _responseBatch.Responses[0].DiscoverArticlesAction;
					eventName = _el_event+discoveryAction.Activity.Name+discoveryAction.Age+discoveryAction.MaximumNumberOfDiscoveries;
					for (var i=0; i<discoveryAction.SearchSections.length; i++) eventName += discoveryAction.SearchSections[i].Name;
					for (var i=0; i<discoveryAction.SearchCategories.length; i++) eventName += discoveryAction.SearchCategories[i].Name;
					for (var i=0; i<discoveryAction.LimitToContributors.length; i++) eventName += discoveryAction.LimitToContributors[i].Name;
					eventName = eventName.toLowerCase().replace(' ','');
					this.renderResponse(customObjects[eventName],discoveryAction.DiscoveredArticles);
				}
			} catch(e) {
				$U.debug("Error caught in: \n  file: '/includes/objects/pluck/js/discovery.js' \n  function: Discovery.fireUponResponse() \nError thrown is:\n" + e);
			}
		},
		renderResponse : function(_widgetObject,_articles) {
			try {
				var activity = _widgetObject.activity;
				var discoveryResponse = '';
				var els_cid = [];
				var disc_array = [];

				for (var i=0; i<_articles.length; i++) {
					var o = {};

					if (_articles[i].PageTitle) {
						o.ArticleKey = _articles[i].ArticleKey.Key;
						o.NumberOfComments = _articles[i].Comments.NumberOfComments;
						o.PageTitle = _articles[i].PageTitle.replace(/\$/g,"&#36;");
						o.PageUrl = _articles[i].PageUrl;
						o.NumberOfRecommendations = _articles[i].Recommendations.NumberOfRecommendations;

						if (activity == "Recommended") {
							var _sort_data = parseInt(o.NumberOfRecommendations);
						} else if (activity == "Commented") {
							var _sort_data = parseInt(o.NumberOfComments);
						}

						var template = new $U.Template(_widgetObject.template);
						disc_array.push( {html:template.evaluate(o),sort_data:_sort_data} );
						els_cid.push(o.ArticleKey);

					}
				}

				disc_array.sort(function(a, b) { var x = a.sort_data; var y = b.sort_data; return y-x; });

				for (var i=0; i<disc_array.length; i++) discoveryResponse += disc_array[i].html;

				$(_widgetObject.updateElId).innerHTML = discoveryResponse;

				var els = $U.getElementsByClassName("socialicons",_widgetObject.updateElId,"span");

				for (var i=0; i<els.length; i++) {
					els[i].className += " d-inline";
					if (!_widgetObject.isDiscovered) CBC.APP.PLUCK.Lineup.addLineupEls({el:els[i],cid:els_cid[i]});
				}

				_widgetObject.isDiscovered = true;

			} catch(e) {
				$U.debug("Error caught in: \n  file: '/includes/objects/pluck/js/discovery.js' \n  function: Discovery.renderResponse() \nError thrown is:\n" + e);
			}
		},
		handleDiscoveryResponse : function() {
		}
	}
}
CBC.register({_name:'Discovery',_class:Discovery,_nameSpace: CBC.APP.PLUCK});