var ratingControl = Class.create();

ratingControl.prototype = {
	
	initialize: function(id) {
		this.value = 0;
		this.container  = $(id);
		if (!this.container) { throw "ID you passed was not found."; }
		/* disable all form controls by default */
		handle_form(this.container.parentNode, 'disable');
		this.status = this.container.getElementsByClassName('rating_status')[0];
			if (!this.status) { throw "Rating Status Conatiner not found."; }
		var modifiers = ['at least', 'at most', ''];
		this.modifierDefault = (arguments[1])?arguments[1]:0;
		this.modifierDefault = modifiers[this.modifierDefault];
		var list = $A(this.container.getElementsByTagName('li'));
		this.list = list;
		this.undoControl = document.createElement('a');
		this.undoControl.appendChild(document.createTextNode('undo'))
		this.undoControl.href = "#";
		this.undoControl.onclick = function() {return false;} // prevent us from follwoing href
		if (this.undoControl.observe) {
			this.undoControl.observe('click', this.undo.bindAsEventListener(self, this), [useCapture = false]);
		}
		else this.undoControl.onclick = this.undo.bindAsEventListener(self, this); //for IE's lame event handling
		
		
		for (var i = 0; i < list.length; i++) {
			if (list[i].observe) {
				$(list[i]).observe('mouseover', this.activate.bindAsEventListener(self), [useCapture = false]);
				$(list[i]).observe('mouseout', this.deactivate.bindAsEventListener(self), [useCapture = false]);
				$(list[i]).observe('click', this.set.bindAsEventListener(self, this), [useCapture = false]);
			}
			else { //Stupid IE...
				list[i].onmouseover = this.activate;
				list[i].onmouseout = this.deactivate;
				list[i].onclick = this.set;
			}
		}
	},
	activate: function(self) {
		// This method handles mouseover events
		//IE stores the calling element in srcElement, target is used by every other browser
		var self = (arguments[0].target)?arguments[0].target:arguments[0].srcElement;
		var group = $(self).previousSiblings();
		group.push(self);
		group.invoke('addClassName', 'active'); // for each item in group, call item.addClassName('active')
		var ungroup = self.nextSiblings();
		ungroup.each( function(element) {
			if (element.hasClassName('set')) element.addClassName('unsure');
		});
	
	},

	deactivate: function(self) {
		// This method handles mouseout events
		//IE stores the calling element in srcElement, target is used by every other browser
		var self = (arguments[0].target)?arguments[0].target:arguments[0].srcElement;
		var group = self.siblings();
		group.push(self);
		group.invoke('removeClassName','active');
		var ungroup = self.nextSiblings();
		ungroup.each( function(element) {
			if (element.hasClassName('set')) element.removeClassName('unsure');
			
		});
	},

	set: function(self, context) {
		//IE stores the calling element in srcElement, target is used by every other browser
		var self = (arguments[0].target)?arguments[0].target:arguments[0].srcElement;
		var group = self.previousSiblings();
		group.push(self);
		group.invoke('addClassName', 'set');
		group.invoke('removeClassName', 'unsure');
		var ungroup = self.nextSiblings();
		ungroup.invoke('removeClassName','set');
		ungroup.invoke('removeClassName','unsure');
		statusMessage = "<span>"+context.modifierDefault+" "+ self.innerHTML.capitalize() +"</span> ("; // context == this
		var contents = context.status.childNodes
		$A(contents).each( function(el) { Element.remove(el); });		
		context.status.innerHTML = statusMessage;
		var undoControl = context.undoControl;
		context.status.appendChild(undoControl);
		context.status.appendChild(document.createTextNode(')'));
		context.value = context.update_value(context);
		handle_form(context.container.parentNode, 'enable');
	},
	preset: function(number) {
		if (number == 0 || number > 5) return;
		selected_star = this.list[number - 1];
		//var self = (arguments[0].target)?arguments[0].target:arguments[0].srcElement;
		var group = selected_star.previousSiblings();
		group.push(selected_star);
		group.invoke('addClassName', 'set');
		group.invoke('removeClassName', 'unsure'); 
		var ungroup = selected_star.nextSiblings();
		ungroup.invoke('removeClassName','set');
		ungroup.invoke('removeClassName','unsure'); 
		statusMessage = "<span>"+this.modifierDefault+" "+selected_star.innerHTML+"</span> ("; 
		var contents = this.status.childNodes
		$A(contents).each( function(el) { Element.remove(el); });		
		this.status.innerHTML = statusMessage;
		var undoControl = this.undoControl;
		this.status.appendChild(undoControl);
		this.status.appendChild(document.createTextNode(')'));
		this.value = number;
		var cPN = this.container.parentNode;
		handle_form(cPN, 'enable');

	},
	undo: function(self, context) {
		context.list.invoke('removeClassName', 'set');
		context.list.invoke('removeClassName', 'unsure');
		context.list.invoke('removeClassName', 'active');
		var contents = context.status.childNodes
		$A(contents).each( function(el) { Element.remove(el); });
		context.status.innerHTML = "On a scale of 1 to " + context.list.length;
		context.value = context.update_value(context);
		handle_form(context.container.parentNode, 'disable');
		return false;
		
	},
	update_value: function(context) {
		var unset = $A(context.list).reject( function(star) { return $(star).hasClassName('set'); });
		return (5 - unset.length);
	}
};
