function ratingHandler() {
	
	var me = this;
	
	this.setup = function() {
		
		var ratingElements = me.getElementsByClassName(document, 'DIV', 'rating');
		try {
			if(me.getStyle(me.getRatingContainer(ratingElements[0]), 'background-image').indexOf('url') == -1)
				return;
		} catch(e) {
			return;
		}
		
		for(var rIndex = 0; rIndex < ratingElements.length; rIndex++) {
			var rating = me.getRatingContainer(ratingElements[rIndex]);
			var rating_stars = rating.getElementsByTagName('A');
			if(ratingElements[rIndex].className.indexOf('ignoreTransaction') == -1) {
				for(var aIndex = 0; aIndex < rating_stars.length; aIndex++) {
					var star = rating_stars[aIndex];
					var rating_url = star.getAttribute('HREF');
						star.setAttribute('rating_url', rating_url);
						star.removeAttribute('HREF');
						star.href = 'javascript:void(0);';
						star.onclick = function() {
							var _me = this;
							var result = me.getParentContainer(_me).getElementsByTagName('DIV')[0];
							var currentRating = me.getElementsByClassName(result.parentNode, 'LI', 'rating_current')[0];	
							var params = new Array();
								params['ajax'] = true;
							doRequest(_me.getAttribute('rating_url'), function(res) {	
								var resVal = Math.round(res.responseXML.documentElement.getAttribute('average')*100)/100;
								var maxVal = res.responseXML.documentElement.getAttribute('max');
								var countVal = res.responseXML.documentElement.getAttribute('totalRatings');
								result.innerHTML = resVal + '\/' + maxVal + ' (' + countVal + ' ratings)';
								currentRating.style.width = res.responseXML.documentElement.getAttribute('average')*18 + 'px';
								if(result.parentNode.className.indexOf('staticOnVote')>-1) {
									var parts = _me.getAttribute('rating_url').split('/');
									me.disableRating(result.parentNode, parts[parts.length-1]);
								}
							}, params);
							return false;
						}
				}(aIndex);
			}
		}(rIndex);
		
	}
	
	this.disableRating = function(par, val) {
		var lis = par.getElementsByTagName('LI');
		if(lis.length > 0)
			par = lis[0].parentNode;
		for(var i = lis.length-1; i > 0; i--) {
			if(lis[i].className = 'rating_current')
				lis[i].style.width = (val * 18) + 'px';
			var anc = lis[i].getElementsByTagName('A');
			if(anc.length > 0) {
				if(anc[0].className.indexOf('star_')>-1)
					par.removeChild(anc[0].parentNode);
			}
		}
		
	}
	
	this.setRatingValue = function(val, input, size, item) {
		if(typeof(input) == 'string')
			input = document.getElementById(input);
		input.value = val;
		var temp = item.parentNode;
		while(temp.className.indexOf('rating')==-1)
			temp = temp.parentNode;
		var current = getElementsByClassName(temp, 'LI', 'rating_current')[0];
		current.style.width = (val * size) + 'px';
		if(temp.className.indexOf('staticOnVote')>-1)
			me.disableRating(temp, val);
	}
	
	this.getStyle = function(oElm, strCssRule){
		var strValue = "";
		if(document.defaultView && document.defaultView.getComputedStyle){
			strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
		}
		else if(oElm.currentStyle){
			strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
				return p1.toUpperCase();
			});
			strValue = oElm.currentStyle[strCssRule];
		}
		return strValue;
	}
	
	this.getElementsByClassName = function(oElm, strTagName, strClassName){
		var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
		var arrReturnElements = new Array();
		strClassName = strClassName.replace(/\-/g, "\\-");
		var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
		var oElement;
		for(var i=0; i<arrElements.length; i++){
			oElement = arrElements[i];
			if(oRegExp.test(oElement.className)){
				arrReturnElements.push(oElement);
			}
		}
		return (arrReturnElements)
	}
		
	this.getRatingContainer = function(el) {
		for(var i = 0; i < el.childNodes.length; i++) {
			if(el.childNodes[i].nodeName == 'UL')
				return el.childNodes[i];
		}
	}
	this.getParentContainer = function(a) {
		while(a.className.indexOf('rating') == -1)
			a = a.parentNode;
		return a;
	}
	
}