﻿var Sawbuck = window.Sawbuck || {};
//Singleton pattern (eager-loading)
Sawbuck.RatingManager = (function() {
	//private properties
	var eventHandlers = [];
	var lockedIds = [];

	function raise(args) {
		for (var i = 0; i < eventHandlers.length; i++) {
			eventHandlers[i](args);
		}
	}
	function findId(id) {
		for (var i = 0; i < lockedIds.length; i++) {
			if (lockedIds[i] == id) {
				return i;
			}
		}
		return -1;

	}

	return {
		timer: null,
		//public methods
		addHandler: function(eventHandler) {
			eventHandlers.push(eventHandler);
		},


		rateListing: function(id, rating) {
			// Send the data to the DB
			$j.ajax({
				type: "POST",
				url: "/service/WebService.asmx/RateListing",
				data: Sawbuck.Utilities.toJson({ Rating: rating, ListingID: id }),
				contentType: "application/json; charset=utf-8",
				dataType: "json",
				processData: false,
				success: function(response) {
					// Track rating
					Sawbuck.Reporting.trackEvent("Rating", "From Search Page", "Value", rating);
					return false;
				},
				error: function() { }
			});
			raise({ id: id, rating: rating });
		},
		lockId: function(id) {
			lockedIds.push(id);
		},
		unLockId: function(id) {
			var index = findId(id);
			if (index > -1) lockedIds.splice(index, 1);
		},
		isLocked: function(id) {
			for (var i = 0; i < lockedIds.length; i++) {
				if (lockedIds[i] == id) {
					return true;
				}
			}
			return false;
		}
	}
})();

jQuery(function($) {
	jQuery('.star-rating li a').live("click", function(e) {
		var re = new RegExp(/\d+$/);
		var $this = jQuery(this);
		var id = $this.parent().parent().attr('id').match(re)[0];
		var rating = $this.text();
		var percent = (rating * 25);
		$this.parent().siblings('.current-rating').css('width', percent + '%');
		Sawbuck.RatingManager.timer = setTimeout(function() {
			if (!Sawbuck.RatingManager.isLocked(id)) {
				Sawbuck.RatingManager.rateListing(id, rating);
			}
		}, 500);
		return false;
	});

	jQuery('.star-rating li a').live("dblclick", function(e) {
		var re = new RegExp(/\d+$/);
		var $this = jQuery(this);
		var id = $this.parent().parent().attr('id').match(re)[0];
		Sawbuck.RatingManager.lockId(id);
		clearTimeout(Sawbuck.RatingManager.timer);
		var rating = 0;
		Sawbuck.RatingManager.rateListing(id, rating);
		var percent = (rating * 25);
		$this.parent().siblings('.current-rating').css('width', percent + '%');
		setTimeout(function() { Sawbuck.RatingManager.unLockId(id); }, 1000);
		return false;
	});
});
