/*
 Product comments
 Requires jquery.js, jquery_form.js
 Author: Stepan Reznikov (stepan@design.ru)
 05.03.2008
 */
var Comments = {

	init : function(productId) {

		if (!this.isInit) {

			this.productId = productId;
			this.progress = $('#comments_progress');
			this.container = $('#comments_container');

			this.backLink = null;
			this.forwardLink = null;

			var me = this;

			$(document).keydown(function(event) {
				me.navigate(event);
			});

			this.load('/comments/?productId=' + this.productId, false);

			this.isInit = true;
		}

	},

	load : function(url, isScrollToTop) {

		$('#comments_paging a').unbind('click');
		this.backLink = null;
		this.forwardLink = null;

		this.container.addClass('hidden');
		this.progress.removeClass('hidden');

		var me = this;
		this.container.load(url + ' #comments_main', function() {
			me.onLoad(isScrollToTop);
		});
	},

	onLoad : function(isScrollToTop) {

		var me = this;
		$('#comments_paging a').click(function(event) {
			me.load($(this).attr('href'), true);
			event.preventDefault();
		});
		this.backLink = $('#back_link');
		this.forwardLink = $('#forward_link');

		this.progress.addClass('hidden');
		this.container.removeClass('hidden');

		if (isScrollToTop) {
			var h1 = $('h1:first');
			var h1Offset = h1.offset();
			if (Math.max(document.documentElement.scrollTop,
					document.body.scrollTop) > (h1Offset.top - 5)) {
				window.scrollTo(0, h1Offset.top - 5);
			}
		}
	},

	navigate : function(event) {
		if (event.ctrlKey) {
			switch (event.keyCode) {
			case 0x25:
				this.backLink.trigger('click');
				break;
			case 0x27:
				this.forwardLink.trigger('click');
				break;
			}
		}
	}

};

var CommentForm = {

	init : function() {

		if (!this.isInit) {

			this.progress = $('#comments_form_progress');
			this.message = $('#comments_form_message');
			this.form = $('#comments_form form');
			this.captcha = $('img[captcha = "yes"]');
			this.captchaInput = $('#comment_captcha');
			this.checkCaptchaError = new RegExp(
					'^<p\\s+(class="error"\\s+captcha="yes"|captcha="yes"\\s+class="error")>');
			this.captchaError = false;

			var me = this;

			var options = {
				target : '#comments_form_message',
				beforeSubmit : function() {
					me.startSubmit();
				},
				success : function(responseText) {
					if (me.checkCaptchaError.exec(responseText)) {
						me.captchaError = true;
					} else {
						me.captchaError = false;
					}
					me.showResponse();
				}
			};

			// Инициализируем Captcha
			if (this.captcha) {
				me.changeCaptcha();
				if (this.captcha.attr('id')) {
					var captchaID = this.captcha.attr('id').substr(8);
					var captchaLink = $('#captcha-changer-' + captchaID);
					if (captchaLink) {
						captchaLink.click(function() {
							me.changeCaptcha();
						});
					}
				}
			}

			// jQuery Form Plugin
			this.form.ajaxForm(options);

			this.isMarkSet = false;
			this.markSelect = $('#comment_mark');
			this.markStarContainer = $('#comment_mark_star');
			this.markStarImages = this.markStarContainer.find('img');
			this.markSelect.addClass('hidden');
			this.markStarContainer.removeClass('hidden');

			this.markStarImages.click(function() {
				me.setMark(this);
			});
			this.markStarImages.hover(function() {
				me.hoverStar(this);
			}, function() {
				me.unhoverStar(this);
			});

			this.isInit = true;
		}

	},

	changeCaptcha : function() {
		if (this.captcha) {
			this.captcha
					.attr(
							'src',
							'/captcha/' + Math.floor(Math.random() * 100000)
									.toString()).css('visibility', 'visible');
		}
	},

	setMark : function(image) {
		if (!this.isMarkSet) {
			var starPos = image.className.match(new RegExp('pos_(\\w+)'))[1];
			this.markSelect.get(0).selectedIndex = starPos;
			this.markStarContainer.addClass('selected');
			this.isMarkSet = true;
		}
	},

	hoverStar : function(image) {
		if (!this.isMarkSet) {
			$(image).prevAll().addClass('hover');
			$(image).addClass('hover');
		}
	},

	unhoverStar : function(image) {
		if (!this.isMarkSet) {
			this.markStarImages.removeClass('hover');
		}
	},

	// pre-submit callback
	startSubmit : function() {
		this.progress.removeClass('hidden');
		return true;
	},

	// post-submit callback
	showResponse : function() {
		var me = this;
		me.message.addClass('hidden');
		if (me.captchaError) {
			me.captcha.css('visibility', 'hidden').attr('src', 'about:blank');
		}
		setTimeout(function() {
			me.progress.addClass('hidden');
			me.message.removeClass('hidden');
			if (me.captchaError) {
				me.form.removeClass('hidden');
				me.changeCaptcha();
				me.captchaInput.attr('value', '').focus();
				fire(me.captchaInput, 'keydown');
			} else {
				me.form.addClass('hidden');
			}

			var h1 = $('h1:first');
			var h1Offset = h1.offset();
			if (Math.max(document.documentElement.scrollTop,
					document.body.scrollTop) > (h1Offset.top - 5)) {
				window.scrollTo(0, h1Offset.top - 5);
			}
		}, 1000);
	}

};