var recentlyRated = null;
var _sample = false;

function numberToClassName(n) {
	var className = "";
	switch (n) {
	case "1":
		className = "oneStar";
		break;
	case "2":
		className = "twoStars"
		break;
	case "3":
		className = "threeStars";
		break;
	case "4":
		className = "fourStars";
		break;
	case "5":
		className = "fiveStars";
		break;
	}
	return className;
}

function handleHover(e) {
	var id = YAHOO.util.Event.getTarget(e).id;
	var stars = id.split('_')[1];
	var product_id = id.split('_')[2];
	var className = numberToClassName(stars);
	YAHOO.util.Dom.addClass(id,className + 'Highlighted');
	
	// set the rating text for this number of stars
	var rateText = YAHOO.util.Dom.get('star_text_' + product_id);
	
	switch (stars) {
	case "1":
		rateText.innerHTML = "hate it";
		break;
	case "2": 
		rateText.innerHTML = "dislike it";
		break;
	case "3":
		rateText.innerHTML = "average";
		break;
	case "4":
		rateText.innerHTML = "like it";
		break;
	case "5":
		rateText.innerHTML = "love it";
		break;
	}
}

function handleLeave(e) {
	var id = YAHOO.util.Event.getTarget(e).id;
	var stars = id.split('_')[1];
	var product_id = id.split('_')[2];
	
	// this may be called after wasRated()
	// which would overwrite the star_text
	if (product_id == recentlyRated) { return; }

	var className = numberToClassName(stars);
	YAHOO.util.Dom.removeClass(id,className + 'Highlighted');
	YAHOO.util.Dom.get('star_text_' + product_id).innerHTML = "rate";
}

function setupRolloverForClass(className) {
	var elements = YAHOO.util.Dom.getElementsByClassName(className,'div');
	for (var i = 0; i < elements.length; i++ ) {
		YAHOO.util.Event.addListener(elements[i], 'mouseover', handleHover);
		YAHOO.util.Event.addListener(elements[i], 'mouseout', handleLeave);
	}
}

function wasRated(obj) {
	var product_id = obj.argument[0];
	var rating = obj.argument[1];

	// no more selection possible
	var elem = YAHOO.util.Dom.get('rating_' + obj.argument[1] + '_' + obj.argument[0]);
	var container = YAHOO.util.Dom.getAncestorByClassName(elem,'starContainer');
	var stars = YAHOO.util.Dom.getChildrenBy(container,function(el){return el.tagName == "DIV";});
	for (var i = 0; i < stars.length; i++) {
		YAHOO.util.Dom.setStyle(stars[i],'display','none');
		YAHOO.util.Dom.removeClass(stars[i],numberToClassName((6-(i+1)).toString()) + 'Highlighted');
	}

	// set a static background to reflect that we've chosen some number
	// of stars
	var className = numberToClassName(rating) + 'Highlighted';
	YAHOO.util.Dom.addClass(container,className);

	// regenerate the change link
	YAHOO.util.Dom.get('star_text_' + product_id).innerHTML = "<a id=\"changeLink_" + product_id + "\" class=\"changeLink\" href=\"\" onclick=\"return false;\">change</a>";
	YAHOO.util.Event.addListener('changeLink_' + product_id,'click',handleChangeLinkClick);
	YAHOO.util.Dom.setStyle('links_' + product_id, 'display', 'block');

	recentlyRated = product_id;
}

function wasNotRated(obj) {
	alert('We\'re sorry, but we couldn\'t rate this product. Please try again later.');
	return;
}

function handleClick(e) {
	var elem = YAHOO.util.Event.getTarget(e);
	var info = elem.id.split('_');
	var product_id = info[2];
	var rating = info[1];

	var callback =  { success: wasRated, failure: wasNotRated, argument: [product_id, rating] };
	if (!_sample) {
		var tx = YAHOO.util.Connect.asyncRequest('GET','/rpc/_rate-product.tcl?product_id=' + product_id + '&rating=' + rating,callback);
	} else {
		var obj = new Object();
		obj.argument = new Array();
		obj.argument[0] = product_id;
		obj.argument[1] = rating;
		wasRated(obj);
	}
}

function handleChangeLinkClick(e) {
	recentlyRated = null;

	var elem = YAHOO.util.Event.getTarget(e);
	var linkContainer = YAHOO.util.Dom.getAncestorByClassName(elem,'rateTextContainer');	
	var starContainer = YAHOO.util.Dom.getPreviousSiblingBy(linkContainer,function(el){ return el.tagName == "DIV"; });
	var starTextContainer = YAHOO.util.Dom.getFirstChild(linkContainer);
	var fields =  ['oneStar','twoStars','threeStars','fourStars','fiveStars'];

	// remove the highlighted background image in the container div
	for (var i = 0; i < fields.length; i++) {
		if (YAHOO.util.Dom.hasClass(starContainer,fields[i] + 'Highlighted')) {
			YAHOO.util.Dom.removeClass(starContainer,fields[i] + 'Highlighted');
		}
	}

	// replace the change link with rate text
	starTextContainer.innerHTML = "rate";

	// enable the star selectors
	var children = YAHOO.util.Dom.getChildrenBy(starContainer,function(el){return el.tagName == "DIV";});
	for (var i = 0; i < children.length; i++) {
		YAHOO.util.Dom.setStyle(children[i],'display','block');
	}
}

function initRatings() {
	if (window.sample) {
		_sample = window.sample;
	}

	var fields =  ['oneStar','twoStars','threeStars','fourStars','fiveStars'];
	for (var i = 0; i < fields.length; i++) {
		setupRolloverForClass(fields[i]);
	}	
	
	// listen for 'click' events on each star icon
	var containers = YAHOO.util.Dom.getElementsByClassName('starContainer','div');
	for (var i = 0; i < containers.length; i++) {
		var stars = YAHOO.util.Dom.getChildren(containers[i]);
		for (var j = 0; j < stars.length; j++) {
			YAHOO.util.Event.addListener(stars[j],'click',handleClick);
		}
	}

	// listen for click on 'change' links
	var changeLinks = YAHOO.util.Dom.getElementsByClassName('changeLink','a');
	for (var i = 0; i < changeLinks.length; i++) {
		YAHOO.util.Event.addListener(changeLinks[i],'click',handleChangeLinkClick);
	}
}

YAHOO.util.Event.onDOMReady(initRatings);
