Sparcq = ( this["Sparcq"] || {}  );


if (!Sparcq.Ratings) {
	Sparcq.Ratings = function (settings) {
		this.init(settings);
	};
}

Sparcq.Ratings.prototype.init = function(args) {
	if (args) {
	}

	this.topic = args.topic;
	this.el = args.el;
	this.numPerPage = args.numPerPage || 10;
	this.refreshRate = args.refreshRate || 0;
	this.isLoading = true;
	this.id = this.el.attr('id');
	this.currentPage = 1;
	this.totalPages = 1;
	this.sort_by = args.sort_by || 'entry_title ASC';
	this.recommendation_sort_by = 'entry_title ASC';
	this.recommendations_filter_by = {};
	this.ratings_filter_by = '';
	this.member_id = SPARCQ.SESSION.getMemberId();
	this.firstLoad = true;
	this.refreshLoad = false;
	this.type = args.type;

	switch(this.type) {
		case 'user_ratings':
			this.appendItem = jQuery('.pastUserRatings');
			this.removeClass = 'rating_wide_default_display';
			this.cloneItem = jQuery('.pastUserRatings .rating_wide_default_display');
			var self = this;
			this.new_paginator = new Sparcq.Paginator({
				pageContainer: this.appendItem,
				paginatorContainer: jQuery('#ratings_ratings'),
				numPerPage: this.numPerPage,
				callback: function(page_num) {
					self.getUserRatingList(page_num);
				}
			});
		break;
		
		case 'item_ratings':
			this.appendItem = jQuery('.pastRatings');
			this.removeClass = 'rating_wide_default_display';
			this.cloneItem = jQuery('.pastRatings .rating_wide_default_display');
			var self = this;
			this.new_paginator = new Sparcq.Paginator({
				pageContainer: this.appendItem,
				paginatorContainer: jQuery('#ratings_ratings'),
				numPerPage: this.numPerPage,
				callback: function(page_num) {
					self.getItemRatingList(page_num);
				}
			});
			$("select[name='filter_by']").change(
			function () {
				$("select[name='filter_by'] option:selected").each(function () {
					var filter_by_val = $(this).val();
					if ( self.ratings_filter_by == filter_by_val ) {
						return;
					}
					self.ratings_filter_by = filter_by_val;
					self.new_paginator.clearCache();
					self.getItemRatingList(1, self.sort_val, self.ratings_filter_by);
				});
			})
			.change();
			$("a[class='ratings_alphabet']").click(
			function () {
				var sort_val = 'entry_title ASC';
				if ( self.sort_by == sort_val ) {
					return;
				}
				self.sort_by = sort_val;
				self.new_paginator.clearCache();
				self.getItemRatingList(1, sort_val);
			});			
			$("a[class='ratings_numeric']").click(
			function () {
				var sort_val = 'rating_value DESC';
				if ( self.sort_by == sort_val ) {
					return;
				}
				self.sort_by = sort_val;
				self.new_paginator.clearCache();
				self.getItemRatingList(1, sort_val);
			});			
			$("a[class='ratings_filter_all']").click(
			function () {
				var filter_by_val = '';
				if ( self.ratings_filter_by == filter_by_val ) {
					return;
				}
				self.ratings_filter_by = filter_by_val;
				self.new_paginator.clearCache();
				self.getItemRatingList(1, self.sort_by, self.ratings_filter_by);
			});
			$("a[class='ratings_filter_10']").click(
			function () {
				var filter_by_val = '10';
				if ( self.ratings_filter_by == filter_by_val ) {
					return;
				}
				self.ratings_filter_by = filter_by_val;
				self.new_paginator.clearCache();
				self.getItemRatingList(1, self.sort_by, self.ratings_filter_by);
			});
			$("a[class='ratings_filter_9']").click(
			function () {
				var filter_by_val = '9';
				if ( self.ratings_filter_by == filter_by_val ) {
					return;
				}
				self.ratings_filter_by = filter_by_val;
				self.new_paginator.clearCache();
				self.getItemRatingList(1, self.sort_by, self.ratings_filter_by);
			});
			$("a[class='ratings_filter_8']").click(
			function () {
				var filter_by_val = '8';
				if ( self.ratings_filter_by == filter_by_val ) {
					return;
				}
				self.ratings_filter_by = filter_by_val;
				self.new_paginator.clearCache();
				self.getItemRatingList(1, self.sort_by, self.ratings_filter_by);
			});
			$("a[class='ratings_filter_7']").click(
			function () {
				var filter_by_val = '7';
				if ( self.ratings_filter_by == filter_by_val ) {
					return;
				}
				self.ratings_filter_by = filter_by_val;
				self.new_paginator.clearCache();
				self.getItemRatingList(1, self.sort_by, self.ratings_filter_by);
			});
			$("a[class='ratings_filter_6']").click(
			function () {
				var filter_by_val = '6';
				if ( self.ratings_filter_by == filter_by_val ) {
					return;
				}
				self.ratings_filter_by = filter_by_val;
				self.new_paginator.clearCache();
				self.getItemRatingList(1, self.sort_by, self.ratings_filter_by);
			});
			$("a[class='ratings_filter_5']").click(
			function () {
				var filter_by_val = '5';
				if ( self.ratings_filter_by == filter_by_val ) {
					return;
				}
				self.ratings_filter_by = filter_by_val;
				self.new_paginator.clearCache();
				self.getItemRatingList(1, self.sort_by, self.ratings_filter_by);
			});
			$("a[class='ratings_filter_4']").click(
			function () {
				var filter_by_val = '4';
				if ( self.ratings_filter_by == filter_by_val ) {
					return;
				}
				self.ratings_filter_by = filter_by_val;
				self.new_paginator.clearCache();
				self.getItemRatingList(1, self.sort_by, self.ratings_filter_by);
			});
			$("a[class='ratings_filter_3']").click(
			function () {
				var filter_by_val = '3';
				if ( self.ratings_filter_by == filter_by_val ) {
					return;
				}
				self.ratings_filter_by = filter_by_val;
				self.new_paginator.clearCache();
				self.getItemRatingList(1, self.sort_by, self.ratings_filter_by);
			});
			$("a[class='ratings_filter_2']").click(
			function () {
				var filter_by_val = '2';
				if ( self.ratings_filter_by == filter_by_val ) {
					return;
				}
				self.ratings_filter_by = filter_by_val;
				self.new_paginator.clearCache();
				self.getItemRatingList(1, self.sort_by, self.ratings_filter_by);
			});
			$("a[class='ratings_filter_1']").click(
			function () {
				var filter_by_val = '1';
				if ( self.ratings_filter_by == filter_by_val ) {
					return;
				}
				self.ratings_filter_by = filter_by_val;
				self.new_paginator.clearCache();
				self.getItemRatingList(1, self.sort_by, self.ratings_filter_by);
			});		
		break;
		
		case 'recommendation_list':
			this.appendItem = jQuery('.pastRatings');
			this.removeClass = 'rating_wide_default_display';
			this.cloneItem = jQuery('.pastRatings .rating_wide_default_display');
			var self = this;
			this.new_paginator = new Sparcq.Paginator({
				pageContainer: this.appendItem,
				paginatorContainer: jQuery('#recommendations'),
				numPerPage: this.numPerPage,
				callback: function(page_num) {
					self.getRecommendationList(page_num);
				}
			});
		break;
	}
};

// This is used in the user profile ratings page
Sparcq.Ratings.prototype.handleWideItemRatingListLoad = function(ret) {
	var ret = ret.parsed_return;
	var new_page = ret.page;
	this.new_paginator.setTotalPages(ret.total_pages);
	this.new_paginator.createCachedPage(ret,new_page);
	var topics = ret.topics || [];

	
	if ( !this.firstLoad && new_page == this.currentPage) {
		return;
	}
	
	

	for (var i=0;i<topics.length;i++) {
		var new_item = this.addRatedItemItem(topics[i],new_page);
	}

	if (this.firstLoad) {
		var total_ratings = ret.total_topics || 0;
		var rate_total_holder = jQuery('#ratings_ratings_holder');
		var template_html = rate_total_holder.html();
		rate_total_holder.html(Sparcq.SQ.parseHtml(
			template_html,{
				total_ratings: Sparcq.SQ.getCountDisplay('rating',total_ratings)	
			}));
		if (this.refreshLoad) {
			jQuery('#ratings_ratings_link').html(Sparcq.SQ.getCountDisplay('rating', total_ratings));
		}
		rate_total_holder.show();
		jQuery('#ratings_comments_box').show();
		//add rate events
		/*
		jQuery('.ratingItems .rateThis',rl.obj).each(function() {
			jQuery(this).click(function() { 
				SPARCQ.SESSION.getNextItem(jQuery(this).attr('title'));
			});
		});
		*/


		var self = this;
		jQuery('#ratings_ratings_link').click(function() {
			jQuery('#ratings_comments_box').trigger('load', 'ratings');
		});

		this.checkForAnchorScroll();
	}



	this.isLoading = false;
//	this.firstLoad = false;
	this.firstLoad = true;
};

Sparcq.Ratings.prototype.checkForAnchorScroll = function() {
	if (location.hash) {
		switch(location.hash) { 
			case '#recent_ratings':
				var self = this;
				setTimeout(function() { Sparcq.SQ.scrollToElement(self.appendItem,-100); }, 500);
			break;
		}
	}

};

Sparcq.Ratings.prototype.handleWideUserRatingListLoad = function(ret) {


	var ret = ret.parsed_return;
	
	var new_page = ret.page;
	this.new_paginator.setTotalPages(ret.total_pages);
	this.new_paginator.createCachedPage(ret,new_page);
	
	var topics = ret.topics;

	if (!this.firstLoad && new_page == this.currentPage) {
		return;
	}

	for (var i=0;i<topics.length;i++) {	
		var new_item = this.addRatedItemUser(topics[i],new_page);
	}

	if (this.firstLoad) {
		var total_ratings = ret.total_topics;
		var rate_total_holder = jQuery('#ratings_ratings_holder');
		var template_html = rate_total_holder.html();

		rate_total_holder.html(Sparcq.SQ.parseHtml(
			template_html,{
				total_ratings: Sparcq.SQ.getCountDisplay('rating',total_ratings)
			}));
		rate_total_holder.show();
		if (this.refreshLoad) {
			jQuery('#ratings_ratings_link').html(Sparcq.SQ.getCountDisplay('rating', total_ratings));
		}
		jQuery('#ratings_comments_box').show();
		//add rate events
		/*
		jQuery('.ratingItems .rateThis',rl.obj).each(function() {
			jQuery(this).click(function() { 
				SPARCQ.SESSION.getNextItem(jQuery(this).attr('title'));
			});
		});
		*/

		var self = this;
		jQuery('#ratings_ratings_link').click(function() {
			jQuery('#ratings_comments_box').trigger('load', 'ratings');
		});
	}

	this.isLoading = false;
	this.firstLoad = false;
	
};

Sparcq.Ratings.prototype.addRatedItemUser = function(vars,page_num) {
	var new_rate_item = this.cloneItem.clone();
	new_rate_item.appendTo(this.new_paginator.getPageNode(page_num));
	new_rate_item.removeClass(this.removeClass);
	Sparcq.SQ.setSimilarUserItemHtml(new_rate_item, vars);
	new_rate_item.show();
	return new_rate_item;
};


// This gets hit
Sparcq.Ratings.prototype.addRatedItemItem = function(vars,page_num,topOrBottom,effectsCallback) {
	var new_rate_item = this.cloneItem.clone();
	var rate_img = jQuery('.rate img', new_rate_item);

	if (topOrBottom == 'top')
		new_rate_item.prependTo(this.new_paginator.getPageNode(page_num));
	else
		new_rate_item.appendTo(this.new_paginator.getPageNode(page_num));

	new_rate_item.removeClass(this.removeClass);
	Sparcq.SQ.setListItemHtml(new_rate_item,vars);
	this.addRateInPlaceEvent(new_rate_item);

	if (SPARCQ.UID && SPARCQ.UID == SPARCQ.SESSION.getMemberId()) {
		this.addRateDeleteEvent(new_rate_item);
	}

	if (effectsCallback && typeof effectsCallback == 'function') {
		effectsCallback.call(new_rate_item);
	}
	else {
		new_rate_item.show();
	}

	return new_rate_item;
};

Sparcq.Ratings.prototype.addRateDeleteEvent = function(new_rate_item) {
	var rate_holder = jQuery('.rate',new_rate_item);
	var del_holder = jQuery('.deleteRating');
	del_holder.show();
	jQuery('.deleteRating a',new_rate_item).click(function() {
		var item_name = jQuery('div.item_name',rate_holder).text();
		
		function ripe_handleDeleteRateItemError(ret) {
			alert('Failed to delete rating');
		}
		
		function ripe_handleDeleteRateItem(ret) {
			new_rate_item.hide();	
			var cur_ratings = parseInt(jQuery('#ratings_ratings_link').html());
			if (cur_ratings) {
				cur_ratings--;
				jQuery('#ratings_ratings_link').html(Sparcq.SQ.getCountDisplay('rating',cur_ratings));
			}
		}


		if (item_name) {
			SPARCQ.SESSION.deleteRatingAndReturn(item_name,{
				success: ripe_handleDeleteRateItem,
				error: ripe_handleDeleteRateItemError 
			});
		} else {
			ripe_handleDeleteRateItemError();
		}
		
		return false;
	});
};

Sparcq.Ratings.prototype.addRateInPlaceEvent = function(new_rate_item,hide_on_rate) {
	Sparcq.SQ.addRateInPlaceEvent(new_rate_item, hide_on_rate);
};

Sparcq.Ratings.prototype.addNewItemRecommendation = function(item,page_num) {	
	var new_rate_item = this.cloneItem.clone();

	new_rate_item.appendTo(this.new_paginator.getPageNode(page_num));
	new_rate_item.removeClass(this.removeClass);
	Sparcq.SQ.setListItemHtml(new_rate_item,item);
	new_rate_item.show();
	this.addRateInPlaceEvent(new_rate_item,true);
	return new_rate_item;

};

Sparcq.Ratings.prototype.checkNoRecommendationsLeftOnPage = function() {
	if (!$('.item_page .item:not(.default_display)').size()) {
		var node = this.new_paginator.getPageNode( 1 );

		if (this.currentPage == 1 && this.totalPages == 1) {			
			node.html("wow, that's really specific. try to broaden your horizons a little bit.");
		}
		else {
			node.html("click 'back' or 'more' to see more results.");
		}
	}
}

Sparcq.Ratings.prototype.refresh = function() {
	this.refreshLoad = true;
	this.firstLoad = true;
	this.new_paginator.clearCache();
	this.new_paginator.getPage(1);
};

Sparcq.Ratings.prototype.handleRecommendationListLoad = function(ret) {
	var ret = ret.parsed_return;
	var new_page = ret.page;
	var groups = ret.groups;
	var topics = ret.topics;

	this.new_paginator.setTotalPages(ret.total_pages);
	this.new_paginator.createCachedPage(ret,new_page);

	if (!this.firstLoad && new_page == this.currentPage) {
		return;
	}

	for (var i=0;i<topics.length;i++) {
		var new_item = this.addNewItemRecommendation(topics[i],new_page);
	}

	var node = this.new_paginator.getPageNode( new_page );

	if (!topics.length) {
		node.html("wow, that's really specific. try to broaden your horizons a little bit.");
	}

	if (groups) {
		this.handleRecommendationsGroupData(groups);
	}

	this.isLoading = false;
	this.firstLoad = true;
	this.totalPages = ret.total_pages;
};

Sparcq.Ratings.prototype.handleRecommendationsGroupData = function(groups) {
	var self = this;

	$('.slider.range.popularity').slider('option',{
		max: groups.total_ratings.max
	});

	if($('.current.average').hasClass('init')) {
		$('.current.average').html('0 - 10');
		$('.current.average').removeClass('init');
	}
	
	if($('.current.popularity').hasClass('init')) {
		$('.current.popularity').html('0 - ' + groups.total_ratings.max);
		$('.current.popularity').removeClass('init');
	}
	
	$('.slide.average.min').html('0');
	$('.slide.average.max').html('10');
	$('.slide.popularity.min').html('0');
	$('.slide.popularity.max').html(groups.total_ratings.max);
}

Sparcq.Ratings.prototype.show = function() {
	var rating_list = jQuery('#ratings_ratings');
	var rating_list_holder = jQuery('#ratings_ratings_holder');
	rating_list_holder.removeClass('is_not_selected');
	rating_list_holder.addClass('is_selected');
	rating_list.show();

};

Sparcq.Ratings.prototype.hide = function() {
	var rating_list = jQuery('#ratings_ratings');
	var rating_list_holder = jQuery('#ratings_ratings_holder');
	rating_list_holder.removeClass('is_selected');
	rating_list_holder.addClass('is_not_selected');
	rating_list.hide();
};


Sparcq.Ratings.prototype.showError = function(msg) {
	alert(msg);
};

Sparcq.Ratings.prototype.getUserRatingList = function(page) {

	var self = this;
	page = page || 1;

	SPARCQ.API.callMethod('topic.getRecentRatings', {
		params: {
			sparcq_member_id: SPARCQ.SESSION.getMemberId(),
			entry_id: self.topic.topic_id,
			return_count: self.numPerPage,
			page: page
		},
		onSuccess: function(ret) {
			self.handleWideUserRatingListLoad(ret);
			//self.showMessage('loaded a rated list component');
		},
		onError: function(ret,id) {
			self.showError('error getting topic recent ratings');
		}
	});

};

// We hit the API call from here and bring in the sort as well
Sparcq.Ratings.prototype.getItemRatingList = function(page) {
	var self = this;
	page = page || 1;
	sort = self.sort_by;
	filter = self.ratings_filter_by;

	SPARCQ.API.callMethod('user.getRecentRatings', {
		params: {
			sparcq_member_id: SPARCQ.UID,
			return_count: self.numPerPage,
			page: page,
			sort_by: sort,
			filter_by: filter
		},
		onSuccess: function(ret) {
			self.handleWideItemRatingListLoad(ret);
		},
		onError: function(ret,id) {
			self.showError('error getting user recent ratings');
		}
	});


};

Sparcq.Ratings.prototype.getRecommendationList = function(page) {
	var self = this;
	var params = {
		sparcq_member_id: SPARCQ.SESSION.getMemberId(),
		return_count: self.numPerPage,
		page: page
	};

	for (var key in this.recommendations_filter_by) {
		var value = this.recommendations_filter_by[key];
		params['filter_' + key] = value;
	}

	if (this.firstLoad)
		params['get_groups'] = 1;

	SPARCQ.API.callMethod('user.getRecommendedTopics', {
		params: params,
		onSuccess: function(ret) {
			self.handleRecommendationListLoad(ret);
		},
		onError: function(ret) {
			self.showError('error getting recommendation list for ');
		}
	});
};

Sparcq.Ratings.prototype.filterRecommendationsBy = function(key, value) {
	if (this.recommendations_filter_by[key] != value) {
		this.recommendations_filter_by[key] = value;
		this.new_paginator.clearCache();
		this.getRecommendationList(1);
	}
};


Sparcq.Ratings.prototype.getItemRatingColorClass = function(rating) {
	return 'bwl_' + Sparcq.SQ.strPadLeft(String(Math.round(rating)),2,'0');
}
