YAHOO.namespace('youporn.rater');

YAHOO.youporn.rater = function () {
	var yue = YAHOO.util.Event;
	var yud = YAHOO.util.Dom;
	
	function Rater(config) {
		this.video_id    = config.video_id;
		this.rated       = false;
		this.donotclear  = false;
		
		var containerEl  = new YAHOO.util.Element(config.containerEl);
		this.containerEl = containerEl;
		this.containerEl.on('contentReady', function() {
			containerEl.removeClass('hidden');
		});
		
		this.statusEl    = new YAHOO.util.Element(config.statusEl);
		
		this.starsEl     = new Array(); 
		for (var i=0; i<config.starsEl.length; i++) {
			this.starsEl[i] = new YAHOO.util.Element(config.starsEl[i]);
			
			this.starsEl[i].on('mouseover', 
				(function(obj, n) { 
					return function() { obj.show(n); }
				})(this, i+1)
			);
			
			this.starsEl[i].on('mouseout', this.triggerClear, this, true);
			
			this.starsEl[i].on('click', 
				(function(obj, n) { 
					return function() { obj.rate(n); } 
				})(this, i+1)
			);
		}
	}
	
	Rater.prototype.show = function(n) {
		this.donotclear = true;
		this.clear(true);
		
		for (var i=0; i<n; i++) {
			this.starsEl[i].get('element').src = 'http://files.youporn.com/images/rating-p.gif';
		}
		
		var status;
		switch (n) {
			case 1: status = 'Awful';     break;
			case 2: status = 'Bad';       break;
			case 3: status = 'Average';   break;
			case 4: status = 'Good';      break;
			case 5: status = 'Excellent'; break;
		}
		this.status(status);
	}
	
	Rater.prototype.triggerClear = function() {
		this.donotclear = false;
		setTimeout((function(obj) { 
			return function() { obj.clear(); }
		})(this), 100);
	}
	
	Rater.prototype.clear = function(ignore) {
		if (ignore || (!this.rated && !this.donotclear)) {
			for (var i=0; i<this.starsEl.length; i++) {
				this.starsEl[i].get('element').src = 'http://files.youporn.com/images/rating.gif';
			}
			this.status('');
		}
	}
	
	Rater.prototype.rate = function(n) {
		this.rated = true;
		
		for (var i=0; i<n; i++) {
			this.starsEl[i].get('element').src = 'http://files.youporn.com/images/rating-p.gif';
		}		
		
		for (var i=0; i<this.starsEl.length; i++) {
			this.starsEl[i].removeListener("mouseover");
			this.starsEl[i].removeListener("mouseout");
			this.starsEl[i].removeListener("click");
		}
		
		this.status('Thank you!');
		
		this.sendRequest(n);
	}
	
	Rater.prototype.status = function (msg) {
		this.statusEl.get('element').innerHTML = msg;
	}
	
	Rater.prototype.sendRequest = function (n) {
		var callback = {
			success: function (o) {},
			failure: function (o) {}
		};
		var transaction = YAHOO.util.Connect.asyncRequest('POST', '/rate/', callback, 'video_id=' + this.video_id + '&rating=' + n + '&mode=ajax');
	}
	
	return {
		create: function (config) {
			new Rater(config);
		}
	};
}();
