UKTV.RatingBox = function(el) {
	return this.init(el);
}


// setup this instance of the ratings widget (event handlers, etc)
UKTV.RatingBox.prototype.init = function(el){
	this.loaded = false;
	this.hasFocus = false;
	this.locked = false;
	this.ratingBox = typeof el == 'string' ? document.getElementById(el) : el;
	
	if (this.ratingBox) {
		// get the main list for rating widget (mandatory)
		this.ul = YAHOO.util.Selector.query('ul.rating', this.ratingBox, true);

		if (this.ul) {
			this.ul.ratingsBox = this;
			YAHOO.util.Event.addListener(this.ul, 'mouseout', this.mouseOutHandler);				
			
			// get and setup the stars (with mouseover and click event handlers)
			this.stars = YAHOO.util.Selector.query('li', this.ul);
			for (var i = (this.stars.length - 1); i >= 0; i--) {
				this.stars[i].ratingsBox = this;
				this.stars[i].index = i;
				YAHOO.util.Event.addListener(this.stars[i], 'mouseover', this.mouseOverHandler);
				
				var _a = YAHOO.util.Selector.query('a', this.stars[i], true);
				if (_a) {
					_a.ratingsBox = this;
					_a.index = i;
					YAHOO.util.Event.addListener(_a, 'click', this.clickHandler);
					this.stars[i].ratingText = _a.innerHTML;
				}
			}
			//display only list (optional)
			this.displayOnly = YAHOO.util.Selector.query('.showRating', this.ratingBox, true);
			
			if(this.displayOnly) {
				this.ulDisplay = YAHOO.util.Selector.query('ul.ratingList', this.ratingBox, true);
	
				if (this.ulDisplay) {
					this.starsDisplay = YAHOO.util.Selector.query('li', this.ulDisplay);
				}
			}
					
			// display rating element (optional)
			this.ratingEl = YAHOO.util.Selector.query('.rating', this.ratingBox, true);
			
			// display rating text element (optional)
			this.noOfRatingsTextEl = YAHOO.util.Selector.query('.noOfRatingsText', this.ratingBox, true);
			
			// rating count element (optional)
			this.ratingCountEl = YAHOO.util.Selector.query('.ratingCount', this.ratingBox, true);
			
			// rating text plural element (optional)
			this.extraSEl = YAHOO.util.Selector.query('.extraS', this.ratingBox, true);
			
			// rating count message (optional)
			this.ratingCountMessageEl = YAHOO.util.Selector.query('.ratingWording', this.ratingBox, true);
			
			// rating message element (optional)
			this.ratingMessageEl = YAHOO.util.Selector.query('.rating-message', this.ratingBox, true);
			if(this.ratingMessageEl){
				this.ratingMessageEl.originalMessage = this.ratingMessageEl.innerHTML;
			}
						
			// rating info element (optional)			
			this.ratingInfoEl = YAHOO.util.Selector.query('.rating-info', this.ratingBox, true);
			
			// your rating element
			this.yourRatingEl = YAHOO.util.Selector.query('.your-rating', this.ratingBox, true);
			
			// locked?
			if (YAHOO.util.Dom.hasClass(this.ul, 'locked')) {
				this.lock();
			}
			
			this.loaded = true;
		}
	}
	return this;
}


UKTV.RatingBox.prototype.mouseOverHandler = function(e){
	var ev = YAHOO.util.Event.getEvent(e);
    var node = YAHOO.util.Event.getTarget(ev);
	var ratingsBox = node.ratingsBox;
	
	if (ratingsBox && !ratingsBox.locked) {
		ratingsBox.hasFocus = true;
		YAHOO.util.Dom.addClass(ratingsBox.ul, 'hover');

		for (var i = 0; i < ratingsBox.stars.length; i++) {
			if (i <= node.index) {
				YAHOO.util.Dom.addClass(ratingsBox.stars[i], 'selected');
				if(YAHOO.util.Dom.hasClass(ratingsBox.stars[i], 'on')){
					YAHOO.util.Dom.removeClass(ratingsBox.stars[i], 'off');
				}
			} else {
				YAHOO.util.Dom.removeClass(ratingsBox.stars[i], 'selected');
				YAHOO.util.Dom.addClass(ratingsBox.stars[i], 'off');
			}
		}
		
		if(ratingsBox.ratingMessageEl){
			ratingsBox.ratingMessageEl.innerHTML = ratingsBox.stars[node.index].ratingText;
		}
	}
}

UKTV.RatingBox.prototype.mouseOutHandler = function(e){
	var ev = YAHOO.util.Event.getEvent(e);
    var node = YAHOO.util.Event.getTarget(ev);
	var ratingsBox = node.ratingsBox;
	
	if (ratingsBox && !ratingsBox.locked) {
		ratingsBox.hasFocus = false;
		YAHOO.util.Dom.removeClass(ratingsBox.ul, 'hover');
		
		if (ratingsBox.ratingMessageEl) {
			ratingsBox.ratingMessageEl.innerHTML = ratingsBox.ratingMessageEl.originalMessage;
		}
		
		for (var i = 0; i < ratingsBox.stars.length; i++) {
			YAHOO.util.Dom.removeClass(ratingsBox.stars[i], 'selected');
			if(YAHOO.util.Dom.hasClass(ratingsBox.stars[i],'on') || YAHOO.util.Dom.hasClass(ratingsBox.stars[i],'half-on') ){
				YAHOO.util.Dom.removeClass(ratingsBox.stars[i], 'off');
			}
		}
	}
}

UKTV.RatingBox.prototype.clickHandler = function(e){
	var ev = YAHOO.util.Event.getEvent(e);
    var node = YAHOO.util.Event.getTarget(ev);
	var ratingsBox = node.ratingsBox;
	
	if (ratingsBox) {		
		YAHOO.util.Event.stopEvent(ev);
		
		if (!ratingsBox.locked) {
			ratingsBox.lock();
			
			var _callback = {
				success: function(o){
					try {
						ratingsBox.ratingSuccess(o);
					}catch(e){ document.location = node.href; };
				},
				failure: function(){ document.location = node.href; }
			};
			
			YAHOO.util.Connect.asyncRequest('POST', node.href + '/format/json', _callback);
		}	
	}
}

UKTV.RatingBox.prototype.lock = function(){
	this.locked = true;
	YAHOO.util.Dom.addClass(this.ul, 'locked');
}

UKTV.RatingBox.prototype.ratingSuccess = function(o){
	var response = YAHOO.lang.JSON.parse(o.responseText);

	// thankyou message...
	if(response.message && this.ratingMessageEl){
		this.ratingMessageEl.innerHTML = response.message;
	}

	// your new rating message...
	if(response.yourRating && this.yourRatingEl){
		this.yourRatingEl.innerHTML = response.yourRating;
	}

	if (this.noOfRatingsTextEl){
		this.noOfRatingsTextEl.style.display = "inline";
	}

	if(response.count && this.ratingCountEl){
		this.ratingCountEl.innerHTML = response.count;
	}
	
	if(response.count && this.extraSEl){
		if(response.count == 1){
			this.extraSEl.innerHTML = '';
		}
		else{
			this.extraSEl.innerHTML = 's';
		}
	}
	
	if (this.ratingCountMessageEl){
		this.ratingCountMessageEl.innerHTML = 'Rate & Comment';
	}
	
	if (response.average && this.starsDisplay){
		for (var i = 0; i <= (this.starsDisplay.length-1); i++) {
			YAHOO.util.Dom.removeClass(this.starsDisplay[i], 'off');
			YAHOO.util.Dom.removeClass(this.starsDisplay[i], 'half');
			YAHOO.util.Dom.removeClass(this.starsDisplay[i], 'on');
			if(response.average >= (i+1)) {
				YAHOO.util.Dom.addClass(this.starsDisplay[i], 'on');
			}
			else {
				if (response.average >= (i+0.5)) {
					YAHOO.util.Dom.addClass(this.starsDisplay[i], 'half')
				}
				else {
					YAHOO.util.Dom.addClass(this.starsDisplay[i], 'off')
				}
			}
		}
	}
}