function Browser() {
	var self = this;
	this.virtBrowser = null;
	this.virtBrowsers = null;

	this.selectBrowser = function() {
		if (self.virtBrowsers) {
			self.virtBrowsers.each(function(i, element) {
				self.virtBrowser.removeClass('browser-' + element.className);
			});
		}
		self.virtBrowser.addClass('browser-' + this.className);
		$.cookie('virtBrowser', this.className, {expires: 365, path: '/'});;
	};
	this.onReady = function() {
		self.virtBrowser = $('.browser');
		self.virtBrowsers = self.virtBrowser.find('.browser-selector div').click(self.selectBrowser);
		self.virtBrowser.find('.browser-selector div' + ($.cookie('virtBrowser')? '.' + $.cookie('virtBrowser'): '') + ':first').click();
	};
}

function Voter() {
	var self = this;
	
	this.tooltip_onMouseover = function(event) {
		var parentSpan = $(this).parent('span'),
			offset = $(this).offset(), offsetParent = $(this).offsetParent().offset();
		parentSpan.siblings('.' + parentSpan.attr('id')).css('top', (offset.top - offsetParent.top + $(this).height() + 10) + 'px').css('left', (offset.left - offsetParent.left - 20) + 'px').show();
	};
	
	this.tooltip_onMouseout = function(event) {
		var parentSpan = $(this).parent('span'), offset = $(this).offset();
		parentSpan.siblings('.' + parentSpan.attr('id')).hide();
	};
	
	this.form_onLoad = function(data, status) {
		switch (status) {
			case "success":
			case "notmodified":
				if ('error' in data && 'code' in data && 'form' in data && data.error == false && data.code == 'DRAW_FORM') {
					var modal = $('#voteModal').html(data.form),
						form = modal.jqm({api: true, modal: true});
					modal.find('form.zf').each(function(i, el) {
						ZForms.buildForm(el);
					});
					modal.find('form.zf .zf-cancel').click(function() {
						if (confirm('Вы уверены что хотите отменить оценку/комментарий?')) {
							form.jqmHide();
						}
					});
					form.jqmShow();
				} else {
					var title = 'error' in data && data.error == false? 'Сообщение': 'Ошибка',
						msg = 'msg' in data? data.msg: 'Произошла неизвестная ошибка. Попробуйте повторить операцию позже.';
					$.growl(title, msg);
				}
				break;
			case "timeout":
			case "error":
			case "parsererror":
			default:
				var msg = 'msg' in data? data.msg: 'Произошла неизвестная ошибка. Попробуйте повторить операцию позже.';
				$.growl('Ошибка', msg);
		}
	};
	
	this.voteForm = function(event) {
		event.preventDefault();
		
		var mode = $(this).hasClass('vote-negativ')? 'negativ': 'pozitiv';
		var resolution = screen.width + "x" + screen.height,
			colorDepth = (screen.colorDepth ? screen.colorDepth : screen.pixelDepth),
			os = (/(win|mac|linux|sunos|solaris|iphone)/.exec(navigator.platform.toLowerCase()) || [u])[0].replace('sunos', 'solaris');
			
		var data = {
			resolution: screen.width + "x" + screen.height,
			colordepth: (screen.colorDepth ? screen.colorDepth : screen.pixelDepth),
			os: (/(win|mac|linux|sunos|solaris|iphone)/.exec(navigator.platform.toLowerCase()) || [u])[0].replace('sunos', 'solaris')
		};
		
		$.post(location.pathname + 'call~vote?mode=' + mode, data, self.form_onLoad, 'json');
	}
	
	this.onReady = function() {
		$('.voting-stat span span').mouseover(self.tooltip_onMouseover).mouseout(self.tooltip_onMouseout);
		$('.voting-form a').click(self.voteForm);
	};
}

function Comments() {
	var self = this;
	
	this.cookie = null;
	
	this.canSelect = function(element) {
		element = $(element);
		if (element.hasClass('current-select')) {
			return false;
		}
		element.siblings('.comments-toolbar-action').removeClass('current-select');
		element.addClass('current-select');
		element.parents('.comments').find('.no-comments').remove();
		return true;
	};
	
	this.showLast = function(event) {
		event.preventDefault();
		
		if (self.canSelect(this)) {
			var comments = $(this).parents('.comments').find('.comment');
			if (comments.size() > 10) {
				comments.hide();
				comments.filter('.comment:gt(' + (comments.size() - 11) + ')').show();
			} else {
				comments.show();
			}
			$.cookie('commentsSelector', '.show-last', {expires: 365, path: '/'});
		}
		
		return false;
	};
	
	this.noComments = function(element) {
		$(element).parents('.comments').append('<p class="no-comments clearfix">Комментарии по выбранным критериям отсутствуют.</p>');
	}
	
	this.showNegativ = function(event) {
		event.preventDefault();
		
		if (self.canSelect(this)) {
			var commentsContainer = $(this).parents('.comments'),
				negativComments = commentsContainer.find('.comment.negativ');
			commentsContainer.find('.comment:not(.negativ)').hide();
			if (negativComments.size() > 0) {
				negativComments.show();
			} else {
				self.noComments(this);
			}
			$.cookie('commentsSelector', '.show-negativ', {expires: 365, path: '/'});
		}
		
		return false;
	};
	
	this.showExpert = function(event) {
		event.preventDefault();
		
		if (self.canSelect(this)) {
			var commentsContainer = $(this).parents('.comments'),
				expertComments = commentsContainer.find('.comment.expert');
			commentsContainer.find('.comment:not(.expert)').hide();
			if (expertComments.size() > 0) {
				expertComments.show();
			} else {
				self.noComments(this);
			}
			$.cookie('commentsSelector', '.show-expert', {expires: 365, path: '/'});
		}
		
		return false;
	};
	
	this.showAll = function(event) {
		event.preventDefault();
		
		if (self.canSelect(this)) {
			$(this).parents('.comments').find('.comment').show();
			$.cookie('commentsSelector', '.show-all', {expires: 365, path: '/'});
		}
		
		return false;
	};
	
	this.onReady = function() {
		var commentsSelector = $.cookie('commentsSelector');
		
		var tollbar = $('.comments-toolbar');
		tollbar.find('.comments-toolbar-action.show-last').click(self.showLast);
		tollbar.find('.comments-toolbar-action.show-all').click(self.showAll);
		tollbar.find('.comments-toolbar-action.show-negativ').click(self.showNegativ);
		tollbar.find('.comments-toolbar-action.show-expert').click(self.showExpert);
		
		if (commentsSelector) {
			tollbar.find('.comments-toolbar-action' + commentsSelector).click();
		} else {
			tollbar.find('.comments-toolbar-action:first').click();
		}
	};
}

var browser = new Browser(),
	voter = new Voter(),
	comments = new Comments();

$(function(){
	browser.onReady();
	voter.onReady();
	comments.onReady();
	
	$.growl.settings.noticeCss = {};
	$.growl.settings.noticeTemplate = ''
		+ '<div class="notice">'
		+ '	<h3>%title%<a class="close" rel="close">&times;</a></h3>'
		+ '	<p>%message%</p>'
		+ '</div>';
	$.growl.settings.dockCss = {};
});
