var RaterManager = function() { 
 
	var _defaultStarSettings;
	var _raterSettingHolder;
	
    this.Bind = function(defaultSettingsCssClass, ratingControlCssClass) { 
		//_defaultStarSettings = $(".ratingStarsSettings").text();
		_defaultStarSettings = $("." + defaultSettingsCssClass + "").text();
		
		//var raters = $(".ratingStars");
		var raters = $("." + ratingControlCssClass + "");
		
		$.each(raters, function(ri, rater) {
		 
			var settings = $(rater).attr('title');
			var config = new RateSetting();
			loadProperties(config, _defaultStarSettings, settings);
			
			$(rater).css('width', config.blockWidth * config.blockCount + 'px');
			$(rater).css('height', config.blockHeight + 'px');
			$(rater).css('background', 'url(' + config.backgroundImage + ') no-repeat');
	
			$(rater).children().remove();
			var i = 0;
			var count = parseInt(config.blockCount);
			for (i = 0; i < count; i++)
			{
				$(rater).append('<li style="width: ' + config.blockWidth + 'px; height: ' + config.blockHeight + 'px;"></li>');
			}
	
			if (config.displayOnly) {
				$(rater).removeAttr('title');
			}
	
			$.each($(rater).children(), function(i, listItem) {
				if (!config.displayOnly) {
					$(listItem).hover(starIn, starOut);
					$(listItem).click(starClick);
				}
			});
			
			var x = config.leftOffset;
			var y = config.topOffset + (config.blockHeight * config.rating);
			positionSprite($(rater), x, y);
		});
	}; 
	
	var starIn = function() { 
		//alert("starIn");
		var tosser = $(this);
		var poppa = tosser.parent();
		var index = tosser.index();
		
		_raterSettingHolder = poppa.attr('title').toString();
		poppa.removeAttr('title');
		poppa.attr('title', '');
		
		var config = new RateSetting();
		loadProperties(config, _defaultStarSettings, _raterSettingHolder);
		
		var x = config.leftOffset;
		var y = config.topOffset + (config.blockHeight * (index + 1));
		positionSprite(tosser.parent(), x, y);
	};
	
	var starOut = function() { 
		var tosser = $(this);
		var poppa = tosser.parent();
		
		var config = new RateSetting();
		loadProperties(config, _defaultStarSettings, _raterSettingHolder);
		
		poppa.attr('title', _raterSettingHolder); 
		
		var x = config.leftOffset;
		var y = config.topOffset + (config.blockHeight * config.rating);
		positionSprite(tosser.parent(), x, y);
	};
	
	var starClick = function() { 
		var tosser = $(this);
		var poppa = tosser.parent();
		var index = tosser.index(); 
		
		var config = new RateSetting();
		loadProperties(config, _defaultStarSettings, _raterSettingHolder);
	
		if (config.stickUserRating) {
			// remove events
			$.each(poppa.children(), function(i, listItem) {
				$(listItem).unbind('click');
				$(listItem).unbind('mouseenter mouseleave'); // unbind the hover
			});
		}
		
		if (window.RaterManager_Rated)
		{
			window.RaterManager_Rated(config.id, (index + 1));
		}
	};
	
	var positionSprite = function(element, x, y) { 
		var position = "-" + x + "px -" + y + "px";
		element.css('background-position', position);
	};
	
	var loadProperties = function(obj, defaultSettings , settings) { 
		defaultSettings = defaultSettings.replace(/'/g, "\"");
		settings = settings.replace(/'/g, "\"");
		var json = jQuery.parseJSON(defaultSettings);
		var settingsJson = jQuery.parseJSON(settings);
		
		if (json != null) {
			jQuery.extend(json, settingsJson);
		} else {
			json = settingsJson;
		}
		
		var props = new PropertyFactory();
		props.Bind(obj, 'id',  json, 'Id', props.Types.string);
		props.Bind(obj, 'rating',  json, 'Rating', props.Types.int);
		props.Bind(obj, 'displayOnly',  json, 'DisplayOnly', props.Types.bool);
		props.Bind(obj, 'stickUserRating',  json, 'StickUserRating', props.Types.bool);
		props.Bind(obj, 'topOffset',  json, 'TopOffset', props.Types.int);
		props.Bind(obj, 'leftOffset',  json, 'LeftOffset', props.Types.int);
		props.Bind(obj, 'blockWidth',  json, 'BlockWidth', props.Types.int);
		props.Bind(obj, 'blockHeight',  json, 'BlockHeight', props.Types.int);
		props.Bind(obj, 'blockCount',  json, 'BlockCount', props.Types.int);
		props.Bind(obj, 'backgroundImage',  json, 'BackgroundImage', props.Types.string);
	};
	
	var RateSetting = function() { 
		this.id = "";
		this.rating = "";
		this.displayOnly = "";
		this.stickUserRating = "";
		this.topOffset = "";
		this.leftOffset = "";
		this.blockWidth = "";
		this.blockHeight = "";
		this.blockCount = "";
		this.backgroundImage = "";
	};

}; 