/**
 * Dynamic Rating stars
 * @copyright 2006 Beau D. Scott http://beauscott.com
 * @
 */

var Stars = Class.create();
Stars.prototype = {
	/**
	 * Mouse X position
	 * @var {Number} options
	 */
	_x: 0,
	/**
	 * Mouse X position
	 * @var {Number} options
	 */
	_y: 0,
	/**
	 * Constructor
	 * @param {Object} options
	 */
	initialize: function(options)
	{

		this.info = false;
		/**
		 * Initialized?
		 * @var (Boolean)
		 */
		this._initialized = false;
		//this.info = false;
		/**
		 * Base option values
		 * @var (Object)
		 */
		this.options = {
			bindField: null,			// Form Field to bind the value to
			maxRating: 5,				// Maximum rating, determines number of stars
			container: null,			// Container of stars
			imagePath: '../Static/image/rating/',                   // Path to star images
			callback: null,				// Callback function, fires when the stars are clicked
			actionURL: null,			// URL to call when clicked. The rating will be appended to the end of the URL (eg: /rate.php?id=5&rating=)
			value: 0,					// Initial Value
			locked: false,
			imageType: 9,				// Initial imageType
			count: 0,
			staticUrl: ""

		};
		Object.extend(this.options, options);
		this.locked = this.options.locked ? true : false;

		/**
		 * Image sources for hover and user-set state ratings
		 */
		this.infoTitle = new Array("oceń","oceń","oceń","oceń","oceń");

		prefix = 'star';

		this._starSrc = {
			empty: this.options.imagePath + prefix +"0.gif",
			full: this.options.imagePath + prefix + "1.gif",
			half: this.options.imagePath + prefix + "05.gif"
		};
		/**
		 * Preload images
		 */
		for(var x in this._starSrc)
		{
			var y = new Image();
			y.src = this._starSrc[x];
		}

		//document.getElem

		/**
		 * Images to show for pre-set values, changes when hovered, if not locked.
		 */
		this._setStarSrc = {
			empty: this.options.imagePath + prefix + "0.gif",
			full: this.options.imagePath + prefix + "1.gif",
			half: this.options.imagePath + prefix + "05.gif"
		};

		/**
		 * Preload images
		 */
		for(var x in this._setStarSrc)
		{
			var y = new Image();
			y.src = this._setStarSrc[x];
		}

		this.value = -1;
		this.stars = [];
		this._clicked = false;


		if(this.options.container)
		{
			this._container = $(this.options.container);
			this.id = this._container.id;
		}
		else
		{
			this.id = 'starsContainer.' + Math.random(0, 100000);

			this._container = $(this.id);
		}
		
		this._display();
		this.setValue(this.options.value);
		this._initialized = true;

		if(this.options.count != 0)
		{
			ratingCountDiv = document.createElement("div");
			ratingCountDiv.setAttribute("id", "ratingCountDiv");
			ratingCountDiv.setAttribute("style", "margin-top:2px;float:right;");
			ratingCountDiv.innerHTML = ' x ';
			this._container.appendChild(ratingCountDiv);

			ratingCount = document.createElement("span");
			ratingCount.setAttribute("id", "ratingCount");
			ratingCount.setAttribute("style", "margin-top:2px;");
			ratingCount.innerHTML = this.options.count + " ";

			ratingCountDiv.appendChild(ratingCount);

			ratingCountImg = document.createElement("img");
			ratingCountImg.setAttribute("src", this.options.staticUrl + "/image/Strona/iconPreserveLogin.gif");
			ratingCountImg.setAttribute("title", "pasztet");
			ratingCountImg.setAttribute("alt", this.options.count);

			ratingCountDiv.appendChild(ratingCountImg);

		//	document.write('<div id="ratingCountDiv" style="margin-top:2px;"> x <span id="ratingCount">' + this.options.count + ' </span> <img src="' + this.options.staticUrl + '/image/Strona/iconPreserveLogin.gif" title="pasztet" alt="zdaniem ' + this.options.count + '"/> </div>' );
		}
		else
		{
			ratingCountDiv = document.createElement("div");
			ratingCountDiv.setAttribute("id", "ratingCountDiv");
			ratingCountDiv.setAttribute("style", "margin-top:2px;float:left;");
			this._container.appendChild(ratingCountDiv);

//				document.write('<div id="ratingCountDiv" style="margin-top:2px;"></div>' );
		}
	},
	_display: function()
	{
		if(this.locked != true)
		{
			infoElementRate = document.createElement("div");
			infoElementRate.setAttribute("class", "infoRating");

			infoElementRate.innerHTML = "" + this.options.desc1 + " : ";
			this._container.appendChild(infoElementRate);
		} else {
			infoElementRate = document.createElement("div");
			infoElementRate.setAttribute("class", "infoRating");

			infoElementRate.innerHTML = "" + this.options.desc2 + " : ";
			this._container.appendChild(infoElementRate);
		}

		for(var i = 0; i < this.options.maxRating; i++)
		{

			var star = new Image();
			star.src = this.locked ? this._starSrc.empty : this._setStarSrc.empty;
			if(this.locked != true)
                star.style.cursor = 'pointer';

			star.title = "oceń!";

			star.className = "imageRating";

			!this.locked && Event.observe(star, 'mouseover', this._starHover.bind(this));
			!this.locked && Event.observe(star, 'click', this._starClick.bind(this));
			!this.locked && Event.observe(star, 'mouseout', this._starClear.bind(this));
			this.stars.push(star);
			this._container.appendChild(star);


		}


	},
	_starHover: function(e)
	{
		if(this.locked) return;
		if(!e) e = window.event;
		var star = Event.element(e);

		var greater = false;
		for(var i = 0; i < this.stars.length; i++)
		{
			this.stars[i].src = greater ? this._starSrc.empty : this._starSrc.full;
			if(this.stars[i] == star) greater = true;
		}
	},
	_starClick: function(e)
	{
		if(this.locked) return;
		if(!e) e = window.event;
		var star = Event.element(e);
		this._clicked = true;
		for(var i = 0; i < this.stars.length; i++)
		{
			if(this.stars[i] == star)
			{
				this.setValue(i+1);
				break;
			}
		}
	},
	_starClear: function(e)
	{
		if(this.locked && this._initialized) return;
		var greater = false;
		for(var i = 0; i < this.stars.length; i++)
		{
			if(i > this.value)
                                greater = true;

			if((this._initialized && this._clicked) || this.value == -1)
				this.stars[i].src = greater ? (this.value + .5 >= i ) ? this._starSrc.half : this._starSrc.empty : this._starSrc.full;
			else
				this.stars[i].src = greater ? (this.value + .5 >= i) ? this._setStarSrc.half : this._setStarSrc.empty : this._setStarSrc.full;
		}
	},


	/**
	 * Sets the value of the star object, redraws the UI
	 * @param {Number} value to set
	 * @param {Boolean} optional, do the callback function, default true
	 */
	setValue: function(val)
	{

		var doCallBack = arguments.length > 1 ? !!arguments[1] : true;
		if(this.locked && this._initialized) return;
		this.value = val-1; //0-based
		if(this.options.bindField)
			$(this.options.bindField).value = val;
		if(this._initialized && doCallBack)
		{
			if(this.options.actionURL)
				new Ajax.Request(this.options.actionURL, {
					onComplete: function(response) { setRating(response) },
					parameters: "rate=" + val, method: 'post'});
			else
				if(this.options.callback)
					this.options['callback'](val);
		}
		this._starClear();
	}
};

function setRating(json)
{
	var rating = json.responseJSON;

	if (rating['success']) {
		eval("st" + rating['id'] + ".setValue(" + rating['rate'] + ", false);");
	}

	stars.setValue(rating["value"], false);

	stars.locked = true;

	spanRateInfo = $$("#" + stars.id + " .infoRating")[0];

	spanRateInfo.innerHTML = stars.options.desc2 + ":";

}
