function agent(v) { return(Math.max(navigator.userAgent.toLowerCase().indexOf(v),0)); }
function abPos(o) { var o=(typeof(o)=='object'?o:$(o)), z={X:0,Y:0}; while(o!=null) { z.X+=o.offsetLeft; z.Y+=o.offsetTop; o=o.offsetParent; }; return(z); }
function XY(e,v) { var o=agent('msie')?{'X':event.clientX+document.documentElement.scrollLeft,'Y':event.clientY+document.documentElement.scrollTop}:{'X':e.pageX,'Y':e.pageY}; return(v?o[v]:o); }

star = {};

var postfix = 'stars';
star.num = 0;
star.prec = 2;


star.unique = function (a) {
	var r = new Array();
	o:for ( var i = 0, n = a.length; i < n; i++) {
		for ( var x = 0, y = r.length; x < y; x++ ) {
			if ( r[x] == a[i]) continue o;
		}
		r[r.length] = a[i];
	}
	return r;
}

star.round = function(num, dec) {
	var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
	return result;
}

star.get_num = function(name) {
	var num = 0;
	var els = $$('input.stars([type="radio"])');
	for (var i = 0; i < els.length; i++) {
		if ( name == els[i].name ) {
			num += 1;
		}

	}

	return num;
}


star.precision = function(num) {
	switch ( star.prec ) {
		case 1:
			var numr = Math.floor(num)+1;
			if ( 1 > numr ) {
				return 1;
			} else {
				return numr;
			}
		break;
		default:
		case 2:
			if ( Math.abs(num-Math.floor(num)) >= 0.5  ) {
				return Math.floor(num) + 1;
			} else {
				return Math.floor(num) + 0.5;
			}
		break;
		case 3:
			return num;
		break;
	}
}

star.mouse = function(e, name) {
	star.num = star.get_num(name);
	if(star.stop || isNaN(star.stop)) {
		star.stop=0;
		document.onmousemove = function(e) {

			var p = abPos($('ul_stars_' + name)), x = XY(e), oX = x.X - p.X, oY = x.Y - p.Y;

			if( oX < 1 || oX > (star.num*17) || oY < 0 || oY > 19 ) {
				star.stop = 1;
				star.revert(name);
			} else {
				var starsSelected = star.precision(star.num*oX/(star.num*17));
				starsSelected = ( starsSelected > star.num ? star.num : starsSelected );
				var fxWidth = ((star.num*17)*starsSelected/star.num) + 'px';
				new Effect.Morph('li_stars_' + name, {
					  style: {
					  	background: "url('templates/eclime_two/images/stars-active.gif') left 25px",
					    fontSize: '1px',
						width: fxWidth,
						color: '#111'
					  },
					  duration: 0.2
					});
				$('div_user_stars_'+name).innerHTML = star.round(starsSelected, 1) + ' ' + postfix;
			}
		};
	}
};

star.update = function(e, name) {
	var n = star.num, v = parseFloat($('div_user_stars_' + name).innerHTML);
	$('li_stars_' + name).title = v;
	$('stars_result_' + name).value = v;
	$('li_stars_'+name).setStyle({
					background: "url('templates/eclime_two/images/stars-active.gif') left 25px",
					fontSize: '1px'
				});
};

star.revert = function(name) {
	if ( 0 >= star.num ) return false;
	n = star.num, v = $('li_stars_' + name).title, vp = v*100/star.num;
	if (0 < v) {
		var swidth = Math.round(vp*(star.num*17)/100);
	} else {
		var swidth = 0;
	}
	new Effect.Morph('li_stars_' + name, {
					  style: {
					    width: swidth + 'px',
					    color: '#888'
					  },
					  duration: 0.5
					});
	$('div_user_stars_' + name).innerHTML = ( v > 0 ? (star.round(v, 1)) + ' ' + postfix:'');
	document.onmousemove='';
};

star.build = function(element) {
	if ( 0 >= star.num ) return false;

	var sw = star.num*17;
	var starstotal = 0;

	if ( $(element.name + '_value') ) {
		starstotal = $(element.name + '_value').value, starstotal = ( starstotal > star.num ? star.num : starstotal );
	}

	var el = document.createElement('div');
	el.setAttribute('id', 'div_stars_' + element.name);

	el.innerHTML = '<ul id="ul_stars_'+element.name+'" class="star" onmousedown="star.update(event,\''+element.name+'\')" onmousemove="star.mouse(event,\''+element.name+'\')" title="Rate This!">' +
				'<li id="li_stars_'+element.name+'" class="curr" title="'+starstotal+'"></li></ul><div id="div_user_stars_'+element.name+'" class="user">3.4 stars</div>' +
				'<input type="hidden" id="stars_result_'+element.name+'" name="'+element.name+'" value="" />';
	element.parentNode.insertBefore(el, element);

	$('ul_stars_' + element.name).setStyle({
					listStyle:	'none',
					margin:		0,
					padding:		0,
					width:		sw + 1 + 'px',
					height:		20  + 'px',
					left:		10 + 'px',
					top:			'-5px',
					position:		'relative',
					cssFloat:		'left',
					background:	"url('templates/eclime_two/images/stars.gif') repeat-x",
					cursor:		'pointer'
				});
	$('li_stars_' + element.name).setStyle({
					display:			'block',
					margin:			0,
					padding:			0,
					width:			sw + 1 + 'px',
					height:			20  + 'px',
					textDecoration:	'none',
					textIndent:		'-9000px',
					zIndex:			20,
					position:			'absolute',
					cssFloat:			'left'
				});
	$('li_stars_' + element.name).setStyle({
					background: "url('templates/eclime_two/images/stars.gif') left 25px",
					fontSize: '1px'
				});
	$('div_user_stars_' + element.name).setStyle({
					left: 15 + 'px',
					position: 'relative',
					cssFloat: 'left',
					fontSize: 13 + 'px',
					fontFamily: 'Arial',
					color: '#888'
				});
}

star.init = function() {


	var labels = $$("label.stars");
	for (var i = 0; i < labels.length; i++) {
			labels[i].style.display = "none";
	}

	var radio = $$('input.stars([type="radio"])');
	var elNames = new Array();
	for (var i = 0; i < radio.length; i++) {
		elNames[i] = radio[i].name;
		var element = radio[i];
	}
	var elNamesu = star.unique(elNames);


	var hidden = $$('input.stars([type="hidden"])');
	for ( var i = 0; i < hidden.length; i++ ) {
		switch ( hidden[i].name ) {
			case 'precision':
				star.prec = parseInt(hidden[i].value);
			break;
		}
	}

	for (var i = 0; i < elNamesu.length; i++) {
		star.num = 0;
		for (var x = 0; x < radio.length; x++) {
			if ( radio[x].name == elNamesu[i] ) {
						radio[x].style.display.disabled = true;
						radio[x].style.display = "none";
						element = radio[x];
						star.num +=1;
			}
		}
		star.build(element);
		star.revert(element.name);
	}
}

Event.observe(window, 'load', star.init, false);
