/*
 * neyDEV JS File
 * Stars Rating
 * --------------
 * Author: Jake Cooney (www.jakecooney.com; jake[at]jakecooney.com)
*/

if(typeof document.getElementsByClassName == 'undefined')
{
	document.getElementsByClassName = function(classname,tag)
	{
		if(!tag) tag = "*";
		var anchs =  document.getElementsByTagName(tag);
		var totalAnchs = anchs.length;
		var regexp = new RegExp('\\b' + classname + '\\b');
		var classItems = new Array()
		
		for(var i = 0; i < totalAnchs; ++i)
		{
			var thisItem = anchs[i];
			if(regexp.test(thisItem.className)) classItems.push(thisItem);
		}
		return(classItems);
	}
}

function XHR()
{
	var xhr;
	try { xhr = new XMLHttpRequest(); }
	catch(e)
	{
		var MSXmlVersion = new Array('MSXML2.XMLHttp.6.0','MSXML2.XMLHttp.5.0','MSXML2.XMLHttp.4.0','MSXML2.XMLHttp.3.0','MSXML2.XMLHttp.2.0','Microsoft.XMLHttp');
		for(var i = 0; i <= MSXmlVersion.length; ++i)
		{
			try { xhr = new ActiveXObject(MSXmlVersion[i]); break; }
			catch(e){}
		}
	}
	return(xhr);
}

function StarsRating(targetClassName,imagesPath,inputName)
{
	var values = new Array();
	var texts = new Array();
	var selectBox; // <select />
	var otherInputs; // <input />, <textarea />
	var root; // <form />
	var layer; // <span.StarsRatingInstance />
	var label; // <small>
	var partsCount;
	
	this.enabled = true;

	this.getSelectBox = function()
	{
		var nodes = document.getElementsByClassName(targetClassName);

		for(var i = 0; i < nodes.length; ++i)
		{
			if(nodes[i].tagName.toLowerCase() == 'form')
			{
				root = nodes[i];
				var classes = new Array(root.className,'StarsRatingRoot');
				root.className = classes.join(' ');
				otherInputs = root.getElementsByTagName('input');
				selectBox = root.getElementsByTagName('select').item(0);
			}
		}

		return(selectBox !== false);
	}

	this.parseSelectBox = function()
	{
		var options = selectBox.getElementsByTagName('option');
		for(var i = 0; i < options.length; ++i)
		{
			values[values.length] = options[i].value;
			texts[texts.length] = options[i].text;
		}
	}

	this.preloadImages = function()
	{
		for(var i in values)
		{
			var img = new Image();
			img.src = imagesPath.replace('%stars',values[i]);
		}
	}

	this.setStars = function(e)
	{
		if(typeof(e) == 'undefined') var e = event;

		var starsCount = StarsRating.prototype.countStars(Math.round(((e.clientX - this.offsetParent.offsetLeft) / this.clientWidth) * 100),partsCount);
		this.style.backgroundImage = "url('" + imagesPath.replace('%stars',starsCount) + "')";
		this.childNodes[0].innerHTML = texts[starsCount];
	}
	this.resetStars = function()
	{
		this.style.backgroundImage = '';
		this.childNodes[0].innerHTML = '';
	}

	this.rate = function(e)
	{
		if(typeof(e) == 'undefined') var e = event;
		
		var starsCount = StarsRating.prototype.countStars(Math.round(((e.clientX - this.offsetParent.offsetLeft) / this.clientWidth) * 100),partsCount);
		
		if(!(xhr = XHR()))
		{
			alert('Sorry, your browser does not support AJAX.\n\nYou can try to turn JavaScript off in your browser and rate using the alternative form.');
			return(false);
		}
	
		xhr.onreadystatechange = StarsRating.prototype.handleXHRResponse;
		
		var data = inputName+'='+escape(starsCount);
		for(var i = 0; i < otherInputs.length; ++i)
			if(otherInputs[i].name != '') data += '&'+otherInputs[i].name+'='+otherInputs[i].value;
		
		if(root.method.toLowerCase() == 'get')
		{
			if(root.action.search('?') == -1) var action = root.action+'?'+data;
			else var action = root.action+'&'+data;
			
			xhr.open('GET',action,true);
			xhr.send(null);
		}
		else if(root.method.toLowerCase() == 'post')
		{
			xhr.open('POST',root.action,true);
			xhr.send(data);
		}
	}

	this.make = function()
	{
		if(!this.getSelectBox()) return(false);
		else this.parseSelectBox();
		this.preloadImages();
		partsCount = values.length - 1;
		
		var allNodes = root.getElementsByTagName('*');
		for(var i = 0; i < allNodes.length; ++i) allNodes[i].style.display = 'none';
		
		layer = document.createElement('span');
		layer.className = 'StarsRatingInstance';
		root.appendChild(layer);

		label = document.createElement('small');
		layer.appendChild(label);

		// Events
		if(this.enabled)
		{
			layer.onmouseover = this.setStars;
			layer.onmousemove = this.setStars;
			layer.onmouseout = this.resetStars;
			layer.onclick = this.rate;
		}
		else
		{
			layer.style.backgroundImage = "url('" + imagesPath.replace('%stars',this.vote) + "')";
			var classes = new Array(layer.className,'disabled');
			layer.className = classes.join(' ');
		}
		
		return(true);
	}
}
StarsRating.prototype.countStars = function(percent,partsCount)
{
	if(percent > 100) percent = 100;

	var perPart = 100 / partsCount;
	var starsCount = 1;
	for(var p = 1; p <= partsCount; ++p)
	{
		if(percent > p * perPart) ++starsCount;
		else break;
	}

	return(starsCount);
}
StarsRating.prototype.handleXHRResponse = function()
{
	if(this.readyState == 4) alert('AJAX: '+this.responseText);
}
