/******************************************
 * The Product View Review/Comments Class
 ******************************************/

onepica.Product.Review = Class.create({
	initialize: function (formId, reviewUlId, addButtonId, readMoreButtonId, messageId, readMoreUrl, loaderId) {
		this.formId = formId;
		this.form = $(formId);
		this.loader = $(loaderId);
		this.validator = new Validation(this.form);
		this.addButton = $(addButtonId);
		this.readMoreButton = $(readMoreButtonId);
		this.readMoreUrl = readMoreUrl;
		this.reviewUl = $(reviewUlId);
		this.submitButton = this.form.down('button');
		this.messageContainer = $(messageId);

		this.addButton.observe('click', function () {
			if (this.form.visible()) {
				this.form.hide();
			}
			else {
				this.form.show();
				this.messageContainer.hide();
			}
		}.bindAsEventListener(this));

		if (this.readMoreButton) {
			this.readMoreButton.observe('click', this.readMore.bindAsEventListener(this));
		}
		this.submitButton.observe('click', this.addReview.bindAsEventListener(this));
	},

	/**
	 * Submits the new comment fields and displays a status message.
	 */
	addReview: function (event) {
		if (this.validator.validate()) {
			this.form.request({
				method: 'post',
				onComplete: this.addReviewSuccess.bindAsEventListener(this),
				onFailure: this.addReviewFailure.bindAsEventListener(this),
				onCreate: this.addReviewCreate.bindAsEventListener(this)
			});
		}
	},

	addReviewSuccess: function (transport) {
		this.form.enable().hide().removeClassName('disabled');
		this.messageContainer.show().innerHTML = transport.responseText;
		this.toggleLoader(0);
	},

	addReviewFailure: function (transport) {
		this.form.enable().hide().removeClassName('disabled');
		this.toggleLoader(0);
	},

	addReviewCreate: function (transport) {
		this.form.disable().addClassName('disabled');
		this.toggleLoader(1);
		this.messageContainer.hide();
	},

	/**
	 * Make a request to grab the next set of customer reviews.
	 */
	readMore: function (event) {
		new onepica.Ajax.Request(this.readMoreUrl, {
			method: 'get',
			parameters: {offset: this.reviewUl.select('li').length},
			onComplete: this.readMoreSuccess.bindAsEventListener(this),
			onFailure: this.readMoreFailure.bindAsEventListener(this),
			onCreate: this.readMoreCreate.bindAsEventListener(this)
		});
	},

	readMoreSuccess: function (transport) {
		this.reviewUl.innerHTML += transport.responseText;
		this.toggleLoader(0);
	},

	readMoreFailure: function (transport) {
		this.toggleLoader(0);
	},

	readMoreCreate: function (transport) {
		this.toggleLoader(1);
		this.messageContainer.hide();
	},

	/**
	 * Shows or hides the AJAX loading gif.
	 */
	toggleLoader: function (show) {
		if (this.loader) {
			if (show) {
				this.loader.show();
			}
			else {
				this.loader.hide();
			}
		}
	}
});
