/*
 * Rating star using Mootools.
 * 
 * @version 1.0. author:cesia email:syjun37@gmail.com
 * 
 * Modified from Dynamic Rating stars @copyright 2006 Beau D. Scott
 * http://beauscott.com
 */
/*
 * Note:valueBox must use continuous integers.If not, there could be some bugs.
 * messageBox and valueBox keys must begin from zero.
 */
Rating = new Class( {
  Implements: [Options, Events],                   
  options: {
			bindField: null,
			maxRating: 5,
			container: null,
			imageDirectory: "images/",
			callback: null,
			actionURL: null,
			value: 0,
			locked: false,
			useOpacityStyle: true,
			messageBox: $A([
				"Poor",
				"Nothing special",
				"Worth watching",
				"Pretty cool",
				"Awesome!"
			]),
			valueBox: $A([
				1,
				2,
				3,
				4,
				5
			])
		},
    
	initialize: function(options) {
    this.setOptions(options);
    
		if (this.options.messageBox.length != this.options.maxRating
				|| this.options.valueBox.length != this.options.maxRating) {
			alert("messageBox's length " + this.options.messageBox.length + " and valueBox's length must be equal to maxRating");
			return;
		}
 
		/**
		 * hover and empty ratings imageSrc.
		 */
		this.hoverImages = {
			EMPTY : this.options.imageDirectory + "empty.gif",
			HALF : this.options.imageDirectory + "hover-half.gif",
			FULL : this.options.imageDirectory + "hover.gif"
		};
 
		/**
		 * preload images
		 */
		for (var x in this.hoverImages) {
			var y = document.createElement("img");
			y.src = this.hoverImages[x];
		}
 
		/**
		 * selected and empty ratings imageSrc.
		 */
		this.selectedImages = {
			EMPTY : this.options.imageDirectory + "empty.gif",
			HALF : this.options.imageDirectory + "selected-half.gif",
			FULL : this.options.imageDirectory + "selected.gif"
		};
		/**
		 * preload images
		 */
		for (var x in this.selectedImages) {
			var y = document.createElement("img");
			y.src = this.selectedImages[x];
		}
 
		if ($defined(this.options.container)) {
			this.container = $(this.options.container);
		} else {
			this.id = "ratecontainer" + Math.random(0, 10000);
			document.write('<span id="' + this.id + '"></span>');
			this.container = $(this.id);
		}
 
		this.initialized = false;
		this.rated = false;
		this.ratings = [];
		this.value = -1;
		this.locked = this.options.locked ? true : false;
		this.useOpacityStyle = this.options.useOpacityStyle ? true : false;
 
		this.display();
		this.setValue(this.options.value);
		this.initialized = true;
	},
 
	display : function() {
		for (var i = 0;i < this.options.maxRating; i++) {
			var rating = $(document.createElement("img"));
			rating.src = this.locked
					? this.selectedImages.EMPTY
					: this.hoverImages.EMPTY;
			rating.style.cursor = "pointer";
			rating.title = this.options.messageBox[i];
			if (!this.locked) {
				rating.addEvent("mouseover", this.hover.bind(this));
				rating.addEvent("click", this.rate.bind(this));
				rating.addEvent("mouseout", this.clear.bind(this));
			}
			this.ratings.push(rating);
			this.container.appendChild(rating);
		}
	},
 
	setValue : function(val) {
		if (this.locked && this.initialized)
			return;
 
		// iterate on options.valueBox to search key for val.
    var whole = Math.floor(val);
    
    var part  = val % 1;
    
    if(part < 0.3) part = 0;
    else if (part < 0.8) part = 0.5;
    else if (part) { part = 1 };    
    this.value = whole + part;
    
    /*
		for (var i = 0;i < this.options.valueBox.length; i++) {
			var value = this.options.valueBox[i];
			if (value >= val + .5) {
				this.value = i - .5;
				break;
			} else if (value == val) {
				this.value = i;
				break;
			}
		}
    */
		/*
		 * this.options.valueBox.each(function(value, key) { if (value == val +
		 * .5) { this.value = key - .5; } else if (value == val) { this.value =
		 * key; } }, this);
		 */
		if (this.options.bindField) {
			$(this.options.bindField).value = val;
		}
		if (this.initialized) {
			if (this.options.actionURL) {
				// ajax submit.
				new Ajax(this.options.actionURL + val, {
					method : "get",
					onComplete : this.options["callback"]
				}).request();
			} else if (this.options.callback) {
				this.options["callback"](val);
			}
		}
		this.clear();
	},
 
	hover : function(ev) {
		if (this.locked)
			return;
		var rating = new Event(ev).target;
		var greater = false;
 
		this.ratings.each(function(el) {
			el.src = greater ? this.hoverImages.EMPTY : this.hoverImages.FULL;
			if (rating == el) {
				greater = true;
				// TODO use opacity style, maybe more beautiful styles should be
				// added.
				if (this.useOpacityStyle) {
					var fx = new Fx.Style(el, "opacity", {
						duration : 500,
						wait : false
					});
					fx.start(.5, 1);
				}
			}
		}, this);
	},
 
	rate : function(ev) {
		if (this.locked)
			return;
		var rating = new Event(ev).target;
		this.rated = true;
 
		this.ratings.some(function(el, i) {
			if (el == rating) {
				this.setValue(this.options.valueBox[i]);
				return true;
			}
		}, this);
	},
 
	clear : function(ev) {
		if (this.locked && this.initialized)
			return;
		var greater = false;
    
		this.ratings.each(function(el, i) {      
			if (i > this.value)
				greater = true;
			if (0 && (this.initialized && this.rated) || this.value == -1)
				el.src = greater ? (this.value + .5 == i)
						? this.hoverImages.HALF
						: this.hoverImages.EMPTY : this.hoverImages.FULL;
			else
        
        if(Math.floor(this.value) > i) el.src = this.selectedImages.FULL;
        else if(this.value == i+0.5) el.src = this.selectedImages.HALF;
        else el.src = this.selectedImages.EMPTY;
        /*
				this.ratings[i].src = greater ? (this.value + .5 == i)
						? this.selectedImages.HALF
						: this.selectedImages.EMPTY : this.selectedImages.FULL; */
		}, this)
	}
});
