messages = new Array("Terrible", "Poor", "Average", "Good", "Excellent");

function _gel(id){ return document.getElementById(id); }
function ref(instance_or_id){ return(typeof(instance_or_id)=="string")?document.getElementById(instance_or_id):instance_or_id; }

function setInnerHTML(div_id,value){ var dstDiv=_gel(div_id); dstDiv.innerHTML=value; }

function toggleClass(element,className){
	var e=ref(element);
	if(!e)return;
	if(hasClass(e,className)) removeClass(e,className); else addClass(e,className); 
}

function hasClass(element,_className){
	if(!element) return; 
	var upperClass=_className.toUpperCase();
	if(element.className){
		var classes=element.className.split(' ');
		for(var i=0;i<classes.length;i++){ if(classes[i].toUpperCase()==upperClass) return true; }
	}
	return false;
}

function addClass(element,_class){ if(!hasClass(element,_class)) element.className+=element.className?(" "+_class):_class; }

function removeClass(element,_class){
	var upperClass=_class.toUpperCase();
	var remainingClasses=[];
	if(element.className){
		var classes=element.className.split(' ');
		for(var i=0;i<classes.length;i++){ if(classes[i].toUpperCase()!=upperClass) { remainingClasses[remainingClasses.length]=classes[i]; } }
		element.className=remainingClasses.join(' ');
	}
}

function findAncestorByClass(element,className){
	var temp=element;
	while(temp!=document){
		if(hasClass(temp,className)) return temp;
		temp=temp.parentNode;
	}
	return null;
}

var UT_RATING_IMG			='star_full';
var UT_RATING_IMG_HALF	='star_half';
var UT_RATING_IMG_BG		='star_none';

function UTRating(maxStars, objectName, ratingMessageId, componentSuffix, size, messages, starCount, ratingField) {
	this.maxStars			= maxStars;
	this.objectName		= objectName;
	this.ratingMessageId	= ratingMessageId
	this.componentSuffix	= componentSuffix
	this.messages			= messages;
	this.ratingField		= ratingField;
	this.starTimer			= null;
	this.starCount			= 0;
	if(starCount){
		this.starCount=starCount;
		var that=this;
		onLoadFunctionList.push(function() { that.drawStars(that.starCount,true); } );
	}
	if(size=='S'){
		UT_RATING_IMG='icn_star_full_11x11'
		UT_RATING_IMG_HALF='icn_star_half_11x11'
		UT_RATING_IMG_BG='icn_star_empty_11x11'
	}
	/// pre-fetch image
	///(new Image()).src=UT_RATING_IMG;
	///(new Image()).src=UT_RATING_IMG_HALF;
	function showStars(starNum,skipMessageUpdate){
		this.clearStarTimer();
		this.greyStars();
		this.colorStars(starNum);
		if(!skipMessageUpdate)
		this.setMessage(starNum,messages);
	}
	function setMessage(starNum){
		if(starNum>0){
			if(!this.savedMessage){ this.savedMessage=document.getElementById(this.ratingMessageId).innerHTML; }
			document.getElementById(this.ratingMessageId).innerHTML=this.messages[starNum-1];
		}
		else 
			if(this.savedMessage){ document.getElementById(this.ratingMessageId).innerHTML=this.savedMessage; }
	}
	function colorStars(starNum){
		var fullStars=Math.floor(starNum+0.25);
		var halfStar=(starNum-fullStars>0.25);
		for(var i=0;i<fullStars;i++){
			removeClass(document.getElementById('star_'+this.componentSuffix+"_"+(i+1)),	UT_RATING_IMG_HALF);
			removeClass(document.getElementById('star_'+this.componentSuffix+"_"+(i+1)),	UT_RATING_IMG_BG);
			addClass(document.getElementById('star_'+this.componentSuffix+"_"+(i+1)),		UT_RATING_IMG);
		}
		if(halfStar){
			removeClass(document.getElementById('star_'+this.componentSuffix+"_"+(i+1)),	UT_RATING_IMG);
			removeClass(document.getElementById('star_'+this.componentSuffix+"_"+(i+1)),	UT_RATING_IMG_BG);
			addClass(document.getElementById('star_'+this.componentSuffix+"_"+(i+1)),		UT_RATING_IMG_HALF);
		}
	}
	function greyStars(){
		for(var i=0;i<this.maxStars;i++){
			removeClass(document.getElementById('star_'+this.componentSuffix+"_"+(i+1)),	UT_RATING_IMG);
			removeClass(document.getElementById('star_'+this.componentSuffix+"_"+(i+1)),	UT_RATING_IMG_HALF);
			addClass(document.getElementById('star_'+this.componentSuffix+"_"+(i+1)),		UT_RATING_IMG_BG);
		}
	}
	function setStars(starNum){
		this.starCount=starNum;
		this.drawStars(starNum);
		document.getElementById(this.ratingField).value = this.starCount;
		this.savedMessage = this.messages[starNum-1];
	}
	
	function drawStars(starNum,skipMessageUpdate) { this.starCount=starNum; this.showStars(starNum,skipMessageUpdate); }
	
	function clearStars() { this.starTimer=window.setTimeout(this.objectName+".resetStars()",300); }

	function resetStars(){
		this.clearStarTimer();
		if(this.starCount) this.drawStars(this.starCount); else this.greyStars();
		this.setMessage(0);
	}
	function clearStarTimer(){ if(this.starTimer){ window.clearTimeout(this.starTimer); this.starTimer=null; } }
	
	this.clearStars=clearStars;
	this.clearStarTimer=clearStarTimer;
	this.greyStars=greyStars;
	this.colorStars=colorStars;
	this.resetStars=resetStars;
	this.setStars=setStars;
	this.drawStars=drawStars;
	this.showStars=showStars;
	this.setMessage=setMessage;
}
