layout_id_pattern = new RegExp(/\blayout\b/);
rating_pattern = new RegExp(/\bstar([0-5])\b/);

var stored_rating_trees = {};
var stored_star_rating_trees = {};

function get_layout_container(element) {
	// Get the container that tells us the layout id:
	for (element=element.parentNode;!element.className.match(layout_id_pattern);element = element.parentNode) {}
	return element;
}

function rate_object() {
	var rating=this.className.match(rating_pattern)[1];
	var layout_container = get_layout_container(this);
	var layout_id = layout_container.id.split('-')[1];
	var star_rating_container=getFirstElementByTagAndClassName('ul', 'star-rating', layout_container);
	addElementClass(star_rating_container, 'loading');

	var d = loadJSONDoc("/ratings/rate_layout/"+layout_id+"/"+rating+"/?xhr");
	var gotData = function (meta) {
		var star;
		var new_rating = numberFormatter('#.##')(parseFloat(meta['new_rating']))
		var rating_container = getFirstElementByTagAndClassName('p', 'rating', layout_container);
		swapDOM(rating_container, P({'class':'rating'}, new_rating));
		for (var i=1;i<=5;i++) {
			star = getFirstElementByTagAndClassName('a', 'star'+i, layout_container);
			if (i<=parseFloat(meta['new_rating'])) {
				addElementClass(star, 'selected');
			} else {
				removeElementClass(star, 'selected');
			}
			star.onclick=function() { return false; };
			star.onmouseover=function() {return false; };
		}
		removeElementClass(star_rating_container, 'loading');
//		alert("Thanks for rating");
	};
	var dataFetchFailed = function (err) {
		alert("ajax error");
	};
	d.addCallbacks(gotData, dataFetchFailed);
	return false;
}

function rating_hover() {
	var star_number = parseInt(this.className.match(rating_pattern)[1]);
	var layout_container = get_layout_container(this);
	for (var i=1;i<=star_number;i++) {
		star = getFirstElementByTagAndClassName('a', 'star'+i, layout_container);
		addElementClass(star, 'hovered');
	}
}

function rating_unhover() {
	var star_number = parseInt(this.className.match(rating_pattern)[1]);
	var layout_container = get_layout_container(this);
	for (var i=1;i<=star_number;i++) {
		star = getFirstElementByTagAndClassName('a', 'star'+i, layout_container);
		removeElementClass(star, 'hovered');
	}
}

function restore_stars(layout_id) {
	elements = getElementsByTagAndClassName('P', 'login-alert');
	for (i=0;i<elements.length;i++) {
		swapDOM(elements[i], stored_star_rating_trees[layout_id]);
	}
	x = $$('#layout-'+layout_id+' p.rating')[0];
	setStyle(x, {'display':'block'});
}


function already_rated() {
	var rating=this.className.match(rating_pattern)[1];
	var layout_container = get_layout_container(this);
	var layout_id = layout_container.id.split('-')[1];
	x = $$('#layout-'+layout_id+' ul.star-rating')[0];
	y = $$('#layout-'+layout_id+' p.rating')[0];
	stored_star_rating_trees[layout_id] = x;
	stored_rating_trees[layout_id] = y;
	setStyle(y, {'display':'none'});
	swapDOM(x, P({'class':'login-alert'}, "You already rated this"));
	setTimeout("restore_stars("+layout_id+")", 2500);
	return false;
}

function setup_layout_ratings() {
	var uls, links
	uls = getElementsByTagAndClassName('ul', 'star-rating');
	for (var i=0;i<uls.length;i++) {
		links = findChildElements(uls[i], ['li > a']);
		for (var j=0;j<links.length;j++) {
			if (uls[i].className.indexOf('already-rated') == -1) {
				links[j].onclick=rate_object;
				links[j].onmouseover=rating_hover;
				links[j].onmouseout=rating_unhover;
			} else {
				links[j].onclick=already_rated;
			}
		}
	}
}

addLoadEvent(setup_layout_ratings);