/****************************************************
 File:     rating.js
 Author:   Dan Wright - http://danwright.info/contact
 Version:  1.0
 Date:     Nov 16 2008
 Requires: prototype.js
 ****************************************************/

if (typeof Rating == 'undefined')
	var Rating = {};

if (typeof Rating.cache == 'undefined')
	Rating.cache = {};

Rating.Version = '1.0';
Rating.REQUIRED_PROTOTYPE = '1.6.0';

Rating.defaultGetActiveRatingIdentifier = function() { return null; }
Rating.getActiveRatingIdentifier = Rating.defaultGetActiveRatingIdentifier;

Rating._urlAjax = null;

Rating.saveComplete = function(request)
{
	if (request.transport != Rating.activeRequest.transport)
		return;
	
	/* The response is expected to be XML of the form:
		<response>
			<result>
				<status>100 OK</status>
			</result>
		</response>
		
		Status 100 indicates success, any other value indicates failure.
	*/
	try	{
		var docXML = request.responseXML;
		var resultNode = docXML.getElementsByTagName('result')[0];
		var statusNode = resultNode.getElementsByTagName('status')[0];
		var statusText = statusNode.firstChild.data;
		var statusCode = parseInt(statusText);
		if (statusCode == 100)
			{
			Rating.setRating(Rating.activeRating);
			Rating.cache[Rating.activeIdentifier] = Rating.activeRating;
			}
		}
	catch (exception)
		{
		}
	Rating.activeRequest = null;
}

Rating.saveViaAjax = function(identifier, rating)
{
	var url = Rating._urlAjax + "?save="+identifier+"&r="+rating;
	var request = new Ajax.Request(url, {method:'get', onComplete: Rating.saveComplete });
	if (request) 
		{
		Rating.activeRequest = request;
		Rating.activeIdentifier = identifier;
		Rating.activeRating = rating;
		}
}

Rating.saveSelf = Rating.saveViaAjax;

Rating.save = function(identifier, rating)
{
	if (rating != Rating.cache[identifier])
		{
		Rating.cache[identifier] = rating;
		if (Rating.saveSelf != null)
			Rating.saveSelf(identifier, rating);
		}
};

Rating.prepare = function(identifier)
{
	Rating.setRating(Rating.cache[identifier]);
};

Rating.clear = function()
{
	Rating.setRating(0);
};

Rating.setRating = function(rating)
{
	if (!rating) rating = 0;
	$$('#rating a').each(function (a) {
				if (a.id <= '_'+rating)
					a.addClassName('on');
				else
					a.removeClassName('on');
				});
};

Rating.choose = function(event)
{
	var a = event.element();
	var newRating = a.id.substr(1);
	var identifier = Rating.getActiveRatingIdentifier ? Rating.getActiveRatingIdentifier() : null;
	if (identifier != null)
		Rating.save(identifier, newRating);
	else
		Rating.setRating(newRating);	
};
	
Rating.over = function(event)
{
	var a = event.element();
	$$('#rating a').each(function (b) {
				if (b.id <= a.id)
					b.addClassName('hover');
				});
};
	
Rating.away = function(event)
{
	$$('#rating a').each(function (b) {
				b.removeClassName('hover');
				});
};
	
Rating.initStars = function(stars)
{
	stars.each(function (a) {
				a.observe('mouseover', Rating.over);
				a.observe('mouseout', Rating.away);
				a.observe('click', Rating.choose);
				});
};

Rating.domLoaded = function()
{
	var stars = $$('#rating a');
	if (null == stars || 0 == stars.length)
		Event.observe(window, 'load', function () { Rating.initStars($$('#rating a')); });
	else
		Rating.initStars(stars);
};

Rating.load = function() 
{
    function convertVersionString(versionString){
      var r = versionString.split('.');
      return parseInt(r[0])*100000 + parseInt(r[1])*1000 + parseInt(r[2]);
    }
 
    if((typeof Prototype=='undefined') || 
       (typeof Element == 'undefined') || 
       (typeof Element.Methods=='undefined') ||
       (convertVersionString(Prototype.Version) < 
        convertVersionString(Rating.REQUIRED_PROTOTYPE)))
       throw("Rating requires the Prototype JavaScript framework >= " + Rating.REQUIRED_PROTOTYPE);

	document.observe('dom:loaded', Rating.domLoaded);
};

Rating.load();

/*** customizations for my site ***/
Rating.saveViaImage = function(identifier, rating)
{
	function getCookie(name) {
				var re = new RegExp("^ *"+name+"=");
				var a = $A(document.cookie.split(';')).findAll( function(ck) {
							return re.test(ck);
							});
				return a.length ? unescape(a[0].substring(a[0].indexOf("=")+1)) : "";
			}		
	var now = new Date();
	var url = Rating._urlImage+"?img="+now.getTime()+"&save="+identifier+"&r="+rating;
	var uid = getCookie('uid');	
	if (uid != "")
		url += "&uid="+uid;
	var request = new Image(0,0);
	request.src = url;
	Rating.activeImageRequest = request;
	Rating.setRating(rating);
	Rating.cache[identifier] = rating;
};

(function() {
	var tld = window.location.hostname.replace(/^.*\.(\w+)/,'$1');
	Rating.getActiveRatingIdentifier = function() { return SlideShow != null ? SlideShow.getActivePhotoIdentifier() : null; }
	Rating._urlImage = "http://danwright."+tld+"/photo/php/ratingAjax.php";
	Rating.saveSelf = Rating.saveViaImage;
})();
