var cToolbar = Class.create({
	data: [],
	folded: [],
	id: 0,
	paragraph: 'end',
	bannedWinInfo: null,
	type: {
		defaults: {
			template: {
				navigation: {
					control: '<a class="navigation #{action}" href="#par:#{paragraph}/action:#{action}"><b>#{text}</b></a>',
					expand: '<a href="#" class="expandAll"><i></i>#{text}</a>',
					toggle: '<a class="toggle"><b>#{text}</b></a>'
				},
				form: {
					form: '<form method="post">'
					+ '<div class="formWrap">'
					+ '<div class="close"></div>'
					+ '<div class="avatar"><img src="#{author_image_url}" alt="#{author_name}" /></div>'
					+ '<h3 class="#{author_class}">#{author_name}</h3>'
					+ '<div class="subject"><label for="formCommentSubject" id="formCommentSubjectLabel">Добавить заголовок…</label><input id="formCommentSubject" type="text" name="subject" /></div>'
					+ '<script type="text/javascript">new iDescription("formCommentSubject");</script>'
					+ '<div class="textarea"><label for="newToolbar_#{toolbar_id}_textarea" id="newToolbar_#{toolbar_id}_textareaLabel">Добавить текст…</label><textarea name="body" id="newToolbar_#{toolbar_id}_textarea"></textarea></div>'
					+ '#{carbon_copy}'
					+ '<div class="control">'
					+ '<div class="submit"><input type="submit" value="#{submit_text}" /></div>'
					+ '</div>'
					+ '</div>'
					+ '</form>',
					view_mode: '<div class="viewMode" id="newToolbar_#{toolbar_id}_view_mode"><span class="label">#{default_label}</span><ul>#{options}</ul></div><input name="view_mode" id="newToolbar_#{toolbar_id}_view_mode_hidden" value="#{default_value}" type="hidden" /><script type="text/javascript">new UISelect("newToolbar_#{toolbar_id}_view_mode_hidden", "newToolbar_#{toolbar_id}_view_mode");</script>',
					from_person: '<div class="fromPerson"><label for="newToolbar_#{toolbar_id}_from_person">От кого:</label><select name="person_id" id="newToolbar_#{toolbar_id}_from_person">#{options}</select></div>',
					carbon_copy: '<div class="cc"><label onClick="addressBook_CC.popup($(this));">Сс:</label><a class="help" href="#cc_help" onClick="return false;">Что это?</a><!--<input type="text" readonly="readonly" name="cc_fake" onClick="addressBook_CC.popup($(this));" onFocus="" /><img src="/i/i-commentArrow.gif" width="10" height="6" alt="" border="0" style="display: none;" />--><span class="list"></span>&nbsp;</div>'
				},
				comment: {
					comment: '<div class="#{classNames}" id="comment#{id}"><div class="inner">'
					+ '<a class="avatar" href="#{author_url}"><img src="#{author_image_url}" alt="#{author_name}" /></a>'
					+ '<div class="meta"><a href="#{author_url}">#{author_name}</a> / <span>#{time}</span> / <span>#{date}</span></div>'
					+ '<h5>#{subject}</h5>'
					+ '#{body}'
					+ '<div class="control"></div>'
					+ '</div></div>',
					deleted: '<div class="#{classNames}" id="comment#{id}"><div class="inner">Комментарий удален</div></div>',
					control: '<a class="#{classNames}" href="#{href}">#{text}</a>',
					link: '<div id="cToolbarLinkPopup"><img src="/i/btn-call-support-wcl.gif" /><div class="pContent">#{link}</div></div>'
				}
			},
			text: {
				navigation: {
					write: 'Комментировать',
					read: 'Читать комментарии',
					expand: {
						hide: 'Свернуть комментарии подписчиков',
						show: 'Показать комментарии подписчиков'
					},
					toggle: 'Свернуть комментарии'
				},
				form: {
					write: 'Опубликовать комментарий',
					reply: 'Опубликовать ответ',
					edit: 'Опубликовать',
					view_mode: ['Ответ виден всем', 'Видно только друзьям', 'Видно только членам клуба']
				},
				comment: {
					edit: 'Редактировать',
					deleting: 'Удалить',
					reply: 'Ответить',
					link: 'Ссылка на комментарий'
				}
			}
		},
		vote: {
			text: {
				navigation: {
					write: 'Ответить',
					read: 'Читать ответы',
					expand: {
						hide: 'Свернуть ответы подписчиков',
						show: 'Показать ответы подписчиков'
					},
					toggle: 'Свернуть ответы'
				},
				form: {
					write: 'Опубликовать ответ',
					reply: 'Опубликовать ответ',
					edit: 'Опубликовать',
					view_mode: ['Ответ виден всем', 'Видно только друзьям', 'Видно только членам клуба']
				},
				comment: {
					reply: 'Ответить',
					edit: 'Редактировать',
					deleting: 'Удалить',
					link: 'Ссылка на комментарий'
				}
			}
		}
	},
	variable: {},
	initialize: function(entry_id, paragraph, options) {
		this.id = entry_id;
		this.paragraph = paragraph;
		
		this.options = options || {};
		this.options.type = this.options.type || 'defaults';
		var path = window.location.pathname.split('/');
		this.options.ctrl = path[1] || '';
		this.permission = this.options.permission || [];
		this.user = this.options.user || {
			id: 0
		};
		this.options.commentatorList = this.options.commentatorList || '.blockCommentator .list a[href]';
		this.options.person_list = this.options.person_list || [];
		this.options.per_page = this.options.per_page || 10;
		
		if (Object.isUndefined(this.user.id) || this.user.id < 1)
			this.permission = [];
			
		var toolbar = $('newToolbar_' + this.id + '_' + this.paragraph);
		this.toolbar = toolbar;
		this.data = this.toolbar.select('.comment[id]');
		
		this.updateVariable();
		
		if(this.options.ctrl == 'community') {
			this.variable.text.form.view_mode.shift();
		}
		
		this.initForm();

		this.renderComment();

		this.renderNavigation();
		
		Event.observe(window, 'load', this.changeState.bind(this, window.location.hash));

		var folded = this.getCommentSubscriber();
		if (this.user.is_snob && folded.size() > 0) {
			var controlExpand = this.toolbar.down('.expandAll');
			if (Object.isUndefined(controlExpand)) {
				this.toolbar.down('H4').insert({
					after: this.variable.template.navigation.expand.interpolate({
						text: this.variable.text.navigation.expand.show
					})
				});
				controlExpand = this.toolbar.down('.expandAll');
				controlExpand.observe('click', this.expandAllClick.bindAsEventListener(this));
			}

			if (this.toolbar.select('.comment[id]').size() > 0) {
				controlExpand.show();
			} else {
				controlExpand.hide();
			}

			if (folded.size() == this.folded.size()) {
				controlExpand.update('<i></i>' + this.variable.text.navigation.expand.hide).addClassName('active');
			} else {
				controlExpand.update('<i></i>' + this.variable.text.navigation.expand.show).removeClassName('active');
			}
		}
		/*
		if (this.toolbar.select('.comment[id]').size() < 1) {
			this.toolbar.removeClassName('expanded');
			addressBook_CC.hide();
		} else {
			this.toolbar.addClassName('expanded');
		}
		*/
	},
	changeState: function(hash) {
		if (window.location.pathname.startsWith('/profile/blog'))
			this.toolbar.select('.comment.folded[id] .expand').invoke('fire', 'control:click');
		
		if (Object.isUndefined(hash))
			hash = window.location.hash;
			
		var matches = /^#(comment|paragraph):(\w+)(?:\/(reply|edit|write))?$/i.exec(hash);
		
		if (matches != null) {
			switch (matches[1]) {
				case 'comment':
					var id = parseInt(matches[2], 10);
					if (Object.isNumber(id)) {
						var comment = this.data.find(function(c) {
							return parseInt(c.id.replace('comment', ''), 10) == id
						});
						if (!Object.isUndefined(comment)) {
							if (this.toolbar.up('.content') && !this.toolbar.up('.content').visible() && tabControll)
								tabControll.switchToContent(this.toolbar.up('.content'));
								
							if (this.toolbar.select('.comment[id]').size() == 0)
								this.renderComment();
							
							var element = this.toolbar.down('#comment' + id);
							
							if (Object.isUndefined(element) || !Object.isElement(element)) {
								return;
							}
							
							if (element.hasClassName('folded') && !comment.hasClassName('snob'))
								element.down('.expand').fire('control:click');
							
							//this.scrollTo(element);
							
							if (!Object.isUndefined(matches[3]) && !matches[3].blank()) {
								var control = element.down('.control .' + matches[3]);
								if (!Object.isUndefined(control) && Object.isElement(control))
									control.fire('control:click');
							}
						} else {
							new Ajax.Request('/webservices/comment-page-link', {
								method: 'get',
								parameters: {
									comment_id: id,
									id: this.id,
									par: this.paragraph,
									per_page: this.options.per_page
								},
								onComplete: function(response) {
									var data = response.responseJSON;
									if (data.status != 'error') {
										window.location = data.url;
									}
								}
							});
						}
					}
					break;
				case 'paragraph':
					if (matches[2] == this.paragraph) {
						if (!this.toolbar.up('.content').visible() && tabControll)
							tabControll.switchToContent(this.toolbar.up('.content'));
						
						/*var action = !Object.isUndefined(matches[3]) && matches[3] == 'reply' ? 'write' : 'read';*/
						var action = matches[3];
						/*window.console.log(action);*/
						var control = this.toolbar.down('a.navigation.' + action);
						if (!Object.isElement(control)) {
							break;
						}
						switch (action) {
							case 'read':
								this.scrollTo(this.toolbar);
								if (this.toolbar.select('.comment[id]').size() == 0)
									control.fire('control:click');
								break;
							case 'write':
								control.fire('control:click');
								break;
							default:
								break;
						}
					}
					break;
				default:
					break;
			}
		}
		
	},
	getCommentCount: function() {
		return this.data.findAll(function(c) {
			return !c.hasClassName('deleted')
		}).size();
	},
	getCommentChild: function(id) {
		var finded = false;
		var getLevel = this.getLevel.bind(this);
		return this.data.findAll(function(c){
			if (finded && getLevel(c) > getLevel(finded) && !c.hasClassName('deleted'))
				return true;
				
			if (finded && getLevel(c) == getLevel(finded))
				finded = false;
			
			if (c.id == id)
				finded = c;
			
			return false;
		});
	},
	getCommentSubscriber: function(data) {
		if (Object.isUndefined(data))
			data = this.data;
		
		return data.findAll(function(c) {
			return !c.hasClassName('snob') && !c.hasClassName('deleted')
		});
	},
	getLevel: function(element) {
		if (Object.isUndefined(element) || !Object.isElement(element))
			return 0;
		var level = /level(\d+)/.exec(element.className);
		return level != null && level.length == 2 ? parseInt(level[1], 10) : 1;
	},
	updateVariable: function() {
		var variable = $H(this.type.defaults);
		if (!Object.isUndefined(this.type[this.options.type]))
			variable.update(this.type[this.options.type]);
		this.variable = variable.toObject();
	},
	renderNavigation: function() {
		userHasBanned = userHasBanned || false;
		if (userHasBanned) {
			this.toolbar.select('a.writeAnchor').invoke('observe', 'click', this.navigationClick.bindAsEventListener(this));
		}
	},
	expandAllClick: function(e) {
		Event.stop(e);
		var controlExpand = Event.findElement(e, 'A');
		if (this.getCommentSubscriber().size() <= this.folded.size()) {
			this.folded.clear();
			this.toolbar.select('.comment[id] .expand').invoke('up', '.comment[id]').invoke('addClassName', 'folded');
			controlExpand.update('<i></i>' + this.variable.text.navigation.expand.show).removeClassName('active');
		} else {
			this.toolbar.select('.comment.folded[id] .expand').invoke('fire', 'control:click');
			controlExpand.update('<i></i>' + this.variable.text.navigation.expand.hide).addClassName('active');
		}
	},
	navigationClick: function(e) {
		Event.stop(e);
		
		this.showBannedInfo();
	},
	initTyniMCE: function(action, focus, noScroll) {
		if (Object.isUndefined(tinyMCE))
			return;
			
		var id = 'newToolbar_' + this.id + '_' + this.paragraph + '_textarea';

		switch (action) {
			case 'add':
				if (!Object.isUndefined(this.form) && Object.isElement(this.form) && this.form.visible()) {

					tinyMCE.execCommand('mceAddControl', false, id);

					$(id + 'Label').removeClassName('hidden');
					focus = focus || false;
					if (focus)
						this.form.focusFirstElement();
					
					if(iDescriptionTinyMCE.edLabel.empty()){
						Event.observe(window, 'load', function(){
							iDescriptionTinyMCE.init(id);
						});
					}
					else{
						new iDescription("formCommentSubject");
						iDescriptionTinyMCE.init(id);
					}

				}
				break;
			default:
				var editor = tinyMCE.get(id);
				if (!Object.isUndefined(editor))
					tinyMCE.execCommand('mceRemoveControl', false, id);
				break;
		}
		var field = $(id);
		if((typeof noScroll == 'undefined' || !noScroll) && field && action == "add") {
			//this.scrollTo(field.up('form'));
		}
	},

	resetForm: function(e) {
		Event.stop(e);
		this.initTyniMCE('del');
		this.form.className = 'level1';
		this.form.down('.subject input').value = '';
		this.form.down('textarea').value = '';
		var ccList = this.form.down('.cc .list');
		if (Object.isElement(ccList)) {
			ccList.update('');
		}
		if (!Object.isUndefined(this.form.down('.fromPerson'))) {
			this.form.down('.fromPerson').show();
		}
		this.toolbar.insert({bottom: this.form});
		/* page navigation */
		var pagingNavigation = this.toolbar.down('.commentPagingBottom');
		if (Object.isElement(pagingNavigation)) {
			this.form.insert({before: pagingNavigation});
		}
		this.initTyniMCE('add', false, true);

		this.commentClearState();
	},
	initForm: function(visible) {
		if ($A(this.permission).findAll(function(p) {
			return ['create_own', 'create_other', 'reply_own', 'reply_other', 'edit_own', 'edit_other'].indexOf(p) > -1
		}).size() < 1) {
			return;
		}
		
		if (this.permission.indexOf('create_own') < 0 && this.permission.indexOf('create_other') > -1 && this.options.person_list.length < 1) {
			return;
		}
		
		userHasBanned = userHasBanned || false;
		if (userHasBanned) {
			this.toolbar.insert({bottom: '<div class="bannedInfoBlock">' + this.printBannedInfo() + '</div>'});
			return;
		}
		
		visible = visible || true;
		
		this.initTyniMCE('del');
		
		if (Object.isUndefined(this.form) || !Object.isElement(this.form)) {
			var cc = (this.user.is_snob || this.options.person_list.length > 0) ? this.variable.template.form.carbon_copy : '';
			this.form = this.toolbar.insert({
				bottom: this.variable.template.form.form.interpolate({
					author_class: this.user.is_snob ? 'userInSubject' : '',
					author_name: this.user.name,
					carbon_copy : cc,
					author_image_url: this.user.image_url,
					submit_text: this.variable.text.form.write,
					toolbar_id: this.id + '_' + this.paragraph
					})
			}).down('form');
			
			/* page navigation */
			var pagingNavigation = this.toolbar.down('.commentPagingBottom');
			if (Object.isElement(pagingNavigation)) {
				this.form.insert({before: pagingNavigation});
			}
			
			this.form.observe('submit', this.request.send.bindAsEventListener(this));
			this.form.observe('control:close', this.resetForm.bindAsEventListener(this));
			this.form.down('.close').observe('click', this.resetForm.bindAsEventListener(this));
		}
		this.form.down('.subject input').value = '';
		this.form.down('textarea').value = '';
		this.form.down('.submit input').value = this.variable.text.form.write;
		var addressBook_CC = this.form.down('.cc');
		if(addressBook_CC) {
			addressBook_CC.down('.list').update('');
		}
		
		
		if ((this.user.is_snob || this.permission.indexOf('create_other') > -1) && Object.isUndefined(this.form.down('.viewMode'))) {
			var options = [],
				default_label = '',
				default_value = 0;
			this.variable.text.form.view_mode.each(function(o, index) {
				options.push('<li class="value_' + index + '">' + o + '</li>');
				if (index == 0) {
					default_label = o;
				}
			});
			this.form.down('.control').insert({
				bottom: this.variable.template.form.view_mode.interpolate({
					options: options.join(''),
					toolbar_id: this.id + '_' + this.paragraph,
					default_label: default_label,
					default_value: default_value
				})
			});
		}
		
		if (this.permission.indexOf('create_other') > -1 && Object.isUndefined(this.form.down('.fromPerson')) && this.options.person_list.length > 0) {
			var options = [];
			this.options.person_list.each(function(p) {
				options.push('<option value="' + p.person_id + '"' + (this.user.id == p.person_id ? 'selected="selected"' : '') + '>' + p.name + '</div>');
			}, this);
			this.form.down('.control').insert({
				before: this.variable.template.form.from_person.interpolate({
					options: options.join(''),
					toolbar_id: this.id + '_' + this.paragraph
					})
				});
		}

		/*if (!visible && this.form.visible()) {
					this.form.hide();
					return;
				} else if (visible && !this.form.visible()) {
					this.form.show();
				}*/
		
		var comment = this.toolbar.down('.comment.reply[id]');
		if (!Object.isUndefined(comment) && Object.isElement(comment)) {
			comment.insert({
				after: this.form
				});
			this.form.className = 'level' + this.getLevel(comment) + ' reply' + (comment.hasClassName('hero') ? (' forHeroLevel' + this.getLevel(comment)) : '');
			this.form.down('input[type=submit]').value = this.variable.text.form.reply;
			
			var viewMode = this.form.down('.viewMode');
			if (!Object.isUndefined(viewMode) && comment.hasClassName('locked'))
				viewMode.remove();

			this.initTyniMCE('add', true);
			return;
		}
		
		var comment = this.toolbar.down('.comment.edit[id]');
		if (!Object.isUndefined(comment) && Object.isElement(comment)) {
			comment.insert({
				after: this.form
				});

			//var data = this.data.find(function(c) { return c.id == comment.id });
			var level = this.getLevel(comment);
			this.form.className = 'level' + level + ' edit';
			this.form.down('input[type=submit]').value = this.variable.text.form.edit;
			
			var form = this.form;
			var user = this.user;
			var permission = this.permission;
			var id = parseInt(comment.id.replace('comment', ''), 10);
			new Ajax.Request('/webservices/getcommentdata/', {
				method: 'post',
				postBody: $H({
					comment_id: id
				}).toQueryString(),
				onComplete: function(response) {
					var data = response.responseText.evalJSON();
					if (data.status != "error") {
						if(!data.html.blank()) {
							addressBook_CC.down('.list').update(data.html);
						}
						
						form.down('.subject input').value = data.subject;
						tinyMCE.activeEditor.setContent(data.body);

						iDescriptionTinyMCE.check();

						if ((user.is_snob || permission.indexOf('edit_other') > -1) && (level == 1 || !comment.previous('.level' + (level - 1)).hasClassName('locked'))) {
							form.down('.viewMode ul li[class~=value_' + data.view_mode + ']').fire('control:select');
						} else {
							form.down('.viewMode').remove();
						}
					}
				}
			});
			
			if (!Object.isUndefined(this.form.down('.fromPerson')))
				this.form.down('.fromPerson').hide();
			
			this.initTyniMCE('add', true);
			return;
		}

		this.form.className = 'level1';
		this.toolbar.insert({
			bottom: this.form
			});
		
		/* page navigation */
		var pagingNavigation = this.toolbar.down('.commentPagingBottom');
		if (Object.isElement(pagingNavigation)) {
			this.form.insert({before: pagingNavigation});
		}
		
		/*if (visible)*/
			this.initTyniMCE('add');
	},
	renderComment: function() {
		var count = this.data.size();
		var observeControls = this.commentControlObserve.bind(this);
		this.data.each(function(c, index) {
			if (c.hasClassName('deleted')) {
				return;
			}
			
			comment = this.toolbar.down('#' + c.id);
			
			if (Object.isUndefined(comment))
				return;
			
			if (!c.hasClassName('snob') && !this.folded.include(c.id)) {
				comment.select('div.expand', 'div.meta a.expandBranch').invoke('observe', 'click', this.commentExtendClick.bindAsEventListener(this)).invoke('observe', 'control:click', this.commentExtendClick.bindAsEventListener(this));
			}
			
			observeControls(comment, c.id);
		}, this);
		/*if (!Object.isUndefined(this.form) && Object.isElement(this.form))
			this.initForm(this.form.visible());*/
	},
	commentControlObserve: function(comment, id) {
		id = parseInt(id.replace('comment', ''), 10);
		
		comment.select(".control a[class!='deleting']").invoke('observe', 'click', this.commentControlClick.bindAsEventListener(this)).invoke('observe', 'control:click', this.commentControlClick.bindAsEventListener(this));

		var C = this;
		comment.select(".control a[class='deleting']").each( function (n) {
			n.observe('click', confirmation.confirm.bindAsEventListener(confirmation, C.request.deleting.bind(C, id), 'deleteQuotationMessage'));
			n.observe('control:click', confirmation.confirm.bindAsEventListener(confirmation, C.request.deleting.bind(C, id), 'deleteQuotationMessage'));
		});
	},
	commentClearState: function() {
		this.toolbar.select('.comment.reply[id]', '.comment.edit[id]').invoke('removeClassName', 'reply').invoke('removeClassName', 'edit');
	},
	bannedTitle: function () {
		return 'Уважаем' + this.user.suffix + ' ' + this.user.name + ',';
	},
	bannedBody: function () {
		var body = '<p>Возможность комментировать и&nbsp;участвовать в&nbsp;дискуссиях ' + (this.user.inblog ? 'в&nbsp;этом блоге' : 'к&nbsp;этой публикации') + ' временно запрещена. Возможность оставлять комментарии будет восстановлена ' + this.user.bandate + '.</p>';

		if (this.user.is_snob) {
			body += '<p>За&nbsp;более подробными разъяснениями&nbsp;Вы можете обратиться к&nbsp;своему лиазону.</p><p>Ваш, клуб &laquo;Сноб&raquo;.</p>';
		} else {
			body += '<p>Если у&nbsp;Вас есть какие-либо вопросы или комментарии, свяжитесь, пожалуйста, с&nbsp;нашей службой поддержки по&nbsp;телефонам&nbsp;<nobr class="phone">+7 (495) 544-22-00</nobr> или&nbsp;<nobr class="phone">+7 (800) 100-11-30</nobr> (бесплатно по&nbsp;России), электронной почте <a href="mailto:snob@snob.ru">snob@snob.ru</a> или нажав на&nbsp;кнопку &laquo;Вызов администрации&raquo; в&nbsp;правом столбце на&nbsp;любой странице сайта.</p><p>Команда проекта &laquo;Сноб&raquo;.</p>';
		}
		
		return body;
	},
	printBannedInfo: function () {
		return '<h2 class="statusTitle">Предупреждение</h2><h3>' + this.bannedTitle() + '</h3>' + this.bannedBody();
	},
	showBannedInfo: function () {
		if (!this.bannedWinInfo) {
			this.bannedWinInfo = new LoginPopup();
			var element = this.bannedWinInfo.update(this.bannedTitle(), this.bannedBody());
			element.down('.title').insert({before: '<h2 class="statusTitle">Предупреждение</h2>'});
		}
		this.bannedWinInfo.show();
	},
	commentControlClick: function(e) {
		Event.stop(e);
		var control = Event.findElement(e, 'A');
		action = control.className.replace('control ', '');
		var comment = control.up('.comment');
		var id = parseInt(/comment(\d+)/.exec(comment.id)[1] || 0, 10);

		userHasBanned = userHasBanned || false;
		if (userHasBanned && action == 'reply') {
			this.showBannedInfo();
			return;
		}

		if (id < 1)
			return;
		
		var cond = comment.hasClassName(action);
		
		this.commentClearState();
		
		switch (action) {
			case 'reply':
			case 'edit':
				if(cond) {
					this.form.fire('control:close');
				} else {
					comment.addClassName(action);
					this.initForm(true);
				}
				break;
			case 'deleting':
				this.request.deleting.bind(this, id);
				this.initForm();
				break;
			case 'link':
				//this.form.hide();
				this.commentLink(e, id);
				break;
			default:
				break;
		}

	},
	commentExtendClick: function(e) {
		var control = Event.element(e);
		
		if (control.up('div[class^=viewMode]')) {
			return
		}
		
		Event.stop(e);
		var comment = control.up('.comment[id]');
		
		if(comment.hasClassName('folded') && !comment.hasClassName('snob')) {
			this.folded.push(comment.id);
			comment.removeClassName('folded');
			if (Prototype.Browser.IE) {
				var image = comment.select('.inner p img');
				image.each(function(element) {
					if (element.getWidth() > 460)
						element.setStyle({width: 460 + 'px'});
				})
			} /* fix for huge images in comments for IE */
			
			if (control.hasClassName('expandBranch')) {
				var data = this.getCommentChild(comment.id);
				
				data.each(function(c) {
					var comment = this.toolbar.down('#' + c.id);
					this.folded.push(c.id);
					comment.removeClassName('folded');
				}, this);
			}

			
			var controlExpand = this.toolbar.down('.expandAll');
			if (this.getCommentSubscriber().size() > this.folded.size()) {
				controlExpand.update('<i></i>' + this.variable.text.navigation.expand.show).removeClassName('active');
			} else {
				controlExpand.update('<i></i>' + this.variable.text.navigation.expand.hide).addClassName('active');
			}
			
			

		} else {
			control = (control.tagName != 'A' ? control.up('a') : control);
			if(control) {
				window.location = control.readAttribute('href');
			}
		}
	},
	commentLink: function(e, id) {
		var element = Event.element(e);
		var offset = element.cumulativeOffset();
		
		var link = window.location.href.replace(window.location.hash, '') + '#comment:' + id;
		
		var popup = $('cToolbarLinkPopup');
		if (!popup) {
			if ($$('.viewport').first()) {
				popup = $$('.viewport').first().insert({
					bottom: this.variable.template.comment.link.interpolate({
						link: link
					})
					}).down('#cToolbarLinkPopup');
			} else {
				popup = $$('body').first().insert({
					bottom: this.variable.template.comment.link.interpolate({
						link: link
					})
					}).down('#cToolbarLinkPopup');
			}
			popup.down('img').observe('click', function(e) {
				Event.stop(e); Event.element(e).up('#cToolbarLinkPopup').remove();
			});
		} else {
			popup.down('.pContent').update(link);
		}
		
		popup.setStyle({
			left: offset.left + 'px',
			top: (offset.top - popup.getHeight() - 10) + 'px'
			});
	},
	request: {
		deleting: function(id) {
			new Ajax.Request('/webservices/commentdelete', {
				method: 'get',
				parameters: {
					id: id,
					entry_id: this.id,
					par: this.paragraph
				},
				onComplete: this.responders.deleting.bind(this)
			});
		},
		send: function(e) {
			Event.stop(e);
			if (Object.isUndefined(this.form) || !Object.isElement(this.form))
				return;
			
			this.form.down('.control input[type=submit]').disable();
			
			var url = '/webservices/comment';
			var parameters = this.form.serialize(true);
			parameters.id = this.id;
			parameters['cc[]'] = [];
			parameters.paragraph = this.paragraph;
			if (!Object.isUndefined(tinyMCE))
				var editor = tinyMCE.get('newToolbar_' + this.id + '_' + this.paragraph + '_textarea');
			if (!Object.isUndefined(editor))
				parameters.body = editor.getContent();
		
			comment = this.form.previous('.comment[id]');
			if (!Object.isUndefined(comment) && Object.isElement(comment) && (comment.hasClassName('reply') || comment.hasClassName('edit'))) {
				url += comment.hasClassName('edit') ? 'edit' : 'create';
				if (Object.isUndefined(comment) || !Object.isElement(comment) || (!comment.hasClassName('edit') && !comment.hasClassName('reply')))
					return;
				
				parameters[comment.hasClassName('edit') ? 'comment_id' : 'parent_id'] = parseInt(comment.id.replace('comment', ''), 10);
			} else {
				url += 'create';
			}
			
			var list = this.form.select('.list a');
			if(list) {
				list.each(function(n) {
					parameters['cc[]'].push(n.readAttribute('ref'));
				});
			}
			
			var replyToCommentinBody = this.replyToCommentInBody();
			if (replyToCommentinBody != false) {
				parameters['parent_id'] = replyToCommentinBody;
			}
			
			new Ajax.Request(url, {
				parameters: parameters,
				onComplete: this.responders.send.bind(this)
				})
		}
	},
	responders: {
		deleting: function(response) {
			var data = response.responseJSON;
			
			if (!Object.isUndefined(data.error) && Object.isUndefined(data.status))
				return;
			
			if (data.status) {
				window.location.reload();
			}
			this.updateBlockCommentator();
		},
		send: function(response) {
			this.form.down('.control input[type=submit]').enable();
			
			var data = response.responseJSON;
			
			if (!Object.isUndefined(data.error) && Object.isUndefined(data.status)) {
				this.commentClearState();
				return;
			}
			
			if (data.status) {
				var level = -1;
				var className = "";
				
				
				if(data.state == "edit") {
					var element = this.toolbar.down('#comment' + data.comment_id);
					if (Object.isUndefined(element) || !Object.isElement(element))
						return;
					
					var className = element.className;
					var match = className.match(/level([0-9])/);
					level = match[1];
					element.id = "comment_to_delete";
					element.insert({
						after: data.html
						});
					element.remove();
					this.form.fire('control:close');
				} else {
					var replyToCommentinBody = this.replyToCommentInBody();
					if(data.parent_id == 0 || replyToCommentinBody != false) {
						this.toolbar.insert({
							bottom: data.html
							});
						new Ajax.Request('/go-to-comment/' + data.comment_id, {
							onComplete: function(response) {
								goToData = response.responseJSON;
								if (goToData.status != 'error') {
									url = goToData.url.replace(/#comment:\d+/, '');
									href = window.location.pathname + window.location.search;
									if (href != url) {
										window.location.href = url + '#all.comments';
									}
								}
							}
						})
					} else {
						var element = this.toolbar.down('#comment' + data.parent_id);
						if (Object.isUndefined(element) || !Object.isElement(element))
							return;
							
						var match = element.className.match(/level([0-9])/);
						level = match[1];
						level++;
						
						element.insert({
							after: data.html
							});
						element.removeClassName("reply");
					}
				}
				
				var comment = this.toolbar.down('#comment' + data.comment_id);
				
				if(!className.blank()) {
					comment.className = className;
				}
				
				comment.removeClassName("edit");
				if(data.view_mode > 0 || (level > 1 && comment.previous('.level' + (level - 1)).hasClassName('locked'))) {
					comment.addClassName("locked");
				} else {
					comment.removeClassName("locked");
				}
				
				if(this.toolbar.select('.comment[id]').size() > 1 && data.state != "edit") {
					comment.removeClassName("first");
				}
				
				if(level > 0 && data.state != 'edit') {
					className = comment.className;
					comment.className = className.replace(/level[0-9]/, 'level' + (level > 5 ? 5 : level));
				}
				
				var previous = comment.previous('.comment[id]');
				if(previous && previous.hasClassName('last')) {
					previous.removeClassName('last');
				}
				
				if(comment.next('.comment[id]')) {
					comment.removeClassName("last");
				}

				this.form.fire('control:close');
				this.commentControlObserve(comment, comment.id);
			}
			
			this.updateBlockCommentator();
		}
	},
	scrollTo: function(element) {
		element = $(element);
		var pos = element.cumulativeOffset();
		
		window.scrollTo(pos[0], pos[1] - (this.windowHeight() - element.getHeight())/3);
	},
	windowHeight: function() {
		if (window.innerHeight) {
			return window.innerHeight;
		}

		if (document.documentElement && document.documentElement.clientHeight) {
			return document.documentElement.clientHeight;
		}

		if (document.body) {
			return document.body.clientHeight;
		}
	},
	replyToCommentInBody: function() {
		var match = /replyInBody(\d+)/.exec(this.form.className);
		return match != null ? parseInt(match[1]) : false;
	},
	updateBlockCommentator: function() {
		if (!Object.isUndefined(cToolbarGlobalVars) && !Object.isUndefined(cToolbarGlobalVars.blockCommentator)) {
			new Ajax.Request('/webservices/get-block-commentator', {
				method: 'post',
				parameters: cToolbarGlobalVars.blockCommentator,
				onComplete: function(response) {
					updatedHtml = response.responseText;
					var element = $('blockCommentator_' + response.request.parameters.id + '_0');
					if (Object.isElement(element)) {
						element.replace(updatedHtml);
					}
				}
			});
		}
	}
});

var addressBook_CC = {
	activeT: "t0",
	parent: null,
	clear: function() {
		var searchElement = $("addressBook_CC").down("input[name='search']");
		searchElement.value = "";
		addressBook_CC.search("");
	},
	template: '<div id="addressBook_CC" class="popupBallon personInfo add" style="display: none;">' +
	'<div class="c l"></div><div class="c r"></div><ul class="tabs"><li id="t2"><div class="c l"></div><div class="c r"></div>Все</li><li id="t0" class="active"><div class="c l"></div><div class="c r"></div>Члены клуба</li><li id="t1"><div class="c l"></div><div class="c r"></div>Подписчики</li></ul>' +
	'<div class="blackRC add"><div class="cn tl"></div><div class="cn tr"></div><div class="content">' +
	'<form><div class="canvas"><div class="row"><div class="opb o"><div class="opb i"><input type="text" name="search" id="searchStr"/></div></div></div>' +
	'<div class="row"><div class="opb o"><div class="opb i"><div id="searchResult"></div></div></div></div>' +
	'</div><p>Кому:</p><div class="list"></div>' +
	'<div class="twobtn"><div class="controll"><a href="#" class="sendPersonMessage btn" onclick="addressBook_CC.hide(); return false;"><b>Отмена</b></a></div><div class="controll ok"><a href="#" class="sendPersonMessage btn" onclick="addressBook_CC.save(); return false;"><b>Ок</b></a></div></div></form>' +
	'</div><div class="cn bl"></div><div class="cn br"></div></div></div>',
	template2: '<div id="addressBook_CC" class="popupBallon personInfo add" style="display: none;">' +
	'<div class="blackRC" style="padding-top:5px;"><div class="cn tl" style="display: block;"></div><div class="cn tr" style="display: block;"></div><div class="content">' +
	'<form><div class="canvas"><div class="row"><div class="opb o"><div class="opb i"><input type="text" name="search" id="searchStr"/></div></div></div>' +
	'<div class="row"><div class="opb o"><div class="opb i"><div id="searchResult"></div></div></div></div>' +
	'</div><p>Кому:</p><div class="list"></div>' +
	'<div class="twobtn"><div class="controll"><a href="#" class="sendPersonMessage btn" onclick="addressBook_CC.hide(); return false;"><b>Отмена</b></a></div><div class="controll ok"><a href="#" class="sendPersonMessage btn" onclick="addressBook_CC.save(); return false;"><b>Ок</b></a></div></div></form>' +
	'</div><div class="cn bl"></div><div class="cn br"></div></div></div>',

	show: function(where) {
		var w = $("addressBook_CC").getWidth();
		$("addressBook_CC").setStyle({
			left: (where.left - w/2) + "px",
			top: (where.top + 25) + "px"
		});
		
		$("addressBook_CC").show();
		$("addressBook_CC").down("form").focusFirstElement();
	},
	hide: function() {
		if($("addressBook_CC")) {
			$("addressBook_CC").hide();
		}
		if(addressBook_CC.parent) {
			addressBook_CC.parent.up('form').select('select').each(function(n){
				n.style.visibility = 'visible'
			});
		}
	},
	popup: function(which) {
		addressBook_CC.parent = $(which).up('.cc').down('label');
		if(!$("addressBook_CC")) {
			if(isSubscriber) {
				this.activeT = "t1";
				Element.insert($$('.viewport').first() ? document.body.down('.viewport') : document.body, {
					'top': addressBook_CC.template2
					});
			} else {
				Element.insert($$('.viewport').first() ? document.body.down('.viewport') : document.body, {
					'top': addressBook_CC.template
					});
	
				$("addressBook_CC").select(".tabs li").each(function(n) {
					n.observe("click", function(e){
						Event.stop(e);
						var element = Event.element(e);
						if(!addressBook_CC.activeT.blank()) {
							$(addressBook_CC.activeT).removeClassName("active");
						}
						element.addClassName("active");
						addressBook_CC.activeT = element.id;
						addressBook_CC.clear();
					});
				});
			}
		}
		
		addressBook_CC.clear();
		
		var searchElement = $("addressBook_CC").down("input[name='search']");
		searchElement.observe("keyup", function(e) {
			var element = Event.element(e);
			
			addressBook_CC.search(element.value);
		});
		
		if(addressBook_CC.parent) {
			addressBook_CC.parent.up('form').select('select').each(function(n){
				n.style.visibility = 'hidden'
			});
			var personList = [];
			addressBook_CC.parent.next('.list').select('a').each( function(n) {
				personList.push('<a href="##{id}" ref="#{id}" onClick="addressBook_CC.removeItem(this); return false;">#{text}</a>'.interpolate({
					id : n.readAttribute('ref'),
					text : n.innerHTML
					}));
			});
			$("addressBook_CC").down(".list").update(personList.size() > 0 ? personList.join('<span>, </span>') : '');
			addressBook_CC.show(addressBook_CC.parent.cumulativeOffset());
		}
	},
	search: function(value) {
		new Ajax.Request('/webservices/searchforperson/', {
			method: 'post',
			postBody: $H({
				type: addressBook_CC.activeT.replace("t", ""),
				str: value
			}).toQueryString(),
			onComplete: function(response) {
				var data = response.responseText.evalJSON();
				if (data.status != "error") {
					$('searchResult').scrollTop = 0;
					$('searchResult').update(addressBook_CC.draw(data.list));
					
					if($('searchResult').down("li")) {
						$('searchResult').select("li").each(function(n){
							if(!n.hasClassName('mark')) {
								n.observe("click", function(e) {
									Event.stop(e);
									var element = Event.element(e);
									if(element.tagName.toUpperCase() != "LI") {
										element = $(element).up("li");
									}
									
									addressBook_CC.deselect();
									
									element.addClassName("selected");
									var list = $("addressBook_CC").down(".list");
									if(!list.down('a[ref = ' + n.id + ']')) {
										var separator = list.select('a').size() > 0 ? '<span>, </span>' : '';
										list.insert({
											'bottom': '#{separator}<a href="##{id}" ref="#{id}" onClick="addressBook_CC.removeItem(this); return false;">#{text}</a>'.interpolate({
												id : n.id,
												text : n.innerHTML,
												separator : separator
											})
											});
									}
								});
							}
						});
					}
				}
			}
		});
	},
	addItem: function(name, id) {
		var list = $("addressBook_CC").down(".list"),
			separator = list.select('a').size() > 0 ? '<span>, </span>' : '';
		
		if (Object.isElement(list.down('a[ref=' + id + ']'))) {
			return;
		}
		
		list.insert('#{separator}<a href="##{id}" ref="#{id}" onClick="addressBook_CC.removeItem(this); return false;">#{text}</a>'.interpolate({
			id : id,
			text : name,
			separator : separator
		}));
	},
	removeItem: function(which) {
		var element = $(which);
		if(element) {
			if(element.next('span')) {
				element.next('span').remove();
			} else if(element.previous('span')) {
				element.previous('span').remove();
			}
			element.remove();
		}
	},
	deselect: function() {
		$('searchResult').select("li").each(function(n) {
			n.removeClassName("selected");
		});
	},
	draw: function(list) {
		var exclude = addressBook_CC.parent.next('.list').select('i').invoke('readAttribute', 'ref');
		var output = "";
		$A(list).each(function(n){
			var nodeClass = (exclude.include(n.id)) ? ' class="mark"' : '';
			output += '<li id="' + n.id + '"' + nodeClass + '>' + n.name + ' ' + n.lastname + '</li>';
		});
		
		return !output.blank() ? "<ul>" + output + "</ul>" : "";
	},
	save: function() {
		var list = $("addressBook_CC").down(".list");
		var container = addressBook_CC.parent.next('.list');
		
		container.select('a').each( function(n) {
			addressBook_CC.removeItem(n);
		});
		
		if(list.select('a').size() > 0) {
			/*addressBook_CC.parent.next('input').hide();
			addressBook_CC.parent.next('img').show();*/
			
			var personList = [];
			list.select('a').each( function(n) {
				personList.push('<a href="##{id}" ref="#{id}" onClick="addressBook_CC.removeItem(this); return false;">#{text}</a>'.interpolate({
					id : n.readAttribute('ref'),
					text : n.innerHTML
					}));
			});
			container.insert({
				bottom: (!container.innerHTML.blank() ? '<span>, </span>' : '') + personList.join('<span>, </span>')
				});
		}
		
		/*if(container.innerHTML.blank()) {
			addressBook_CC.parent.next('input').show();
			addressBook_CC.parent.next('img').hide();
		}*/
		addressBook_CC.hide();
	}
};

var cToolbarGuest = Class.create({
	initialize: function(id) {
		this.toolbar = $('newToolbar_' + id);
		this.toolbar.select('.comment .inner .control .link').each(function(element) {
			element.observe('click', function(e) {
				Event.stop(e);
				var link = '<div id="cToolbarLinkPopup"><img src="/i/btn-call-support-wcl.gif" /><div class="pContent">#{link}</div></div>';
				var offset = element.cumulativeOffset();
				var popup = $('cToolbarLinkPopup');
				if (!popup) {
					popup = $$('body').first().insert({
						bottom: link.interpolate({
							link: Event.element(e).href
						})
						}).down('#cToolbarLinkPopup');
					popup.down('img').observe('click', function(e) { 
						Event.stop(e); Event.element(e).up('#cToolbarLinkPopup').remove();
					});
				} else {
					popup.down('.pContent').update(Event.element(e).href);
				}
				popup.setStyle({
					left: offset.left,
					top: offset.top - popup.getHeight() - 10
					});
			});
		});
		if (this.toolbar.select('.comment').size() == 0) {
			this.toolbar.removeClassName('expanded');
		}

	}
});

var UISelect = Class.create({
	initialize: function(input, container, options) {
		this.input = $(input);
		this.container = $(container);
		this.options = options || {};
		
		this.options.hover = this.options.hover || 'hover';
		
		this.container.observe('click', this.hover.bindAsEventListener(this));
		this.container.select('ul li').invoke('observe', 'click', this.setOption.bindAsEventListener(this)).invoke('observe', 'control:select', this.setOption.bindAsEventListener(this));
		if (Prototype.Browser.IE) {
			this.container.select('ul li').invoke(
				'observe', 'mouseover', this.hoverOption.bindAsEventListener(this)
			).invoke(
				'observe', 'mouseout', this.hoverOption.bindAsEventListener(this)
			)
		}
	},
	hover: function(e) {
		this.container.toggleClassName(this.options.hover);
		Event.stop(e);
	},
	hoverOption: function(e) {
		Event.element(e).toggleClassName(this.options.hover);
	},
	setOption: function(e) {
		var value = /value_(\d+)/.exec(Event.element(e).className);
		
		this.input.value = value != null && value.length == 2 ? parseInt(value[1]) : 0;
		this.container.down('.label').update(Event.element(e).innerHTML);
	}
});

var commentInBody = Class.create({
	initialize: function(toolbar) {
		this.toolbar = $(toolbar);
		this.toolbar.select('.comment .control .reply').invoke('observe', 'click', this.reply.bindAsEventListener(this));
	},
	reply: function(e) {
		Event.stop(e);
		var element = Event.element(e);
		var comment = /comment:(\d+)/.exec(element.readAttribute('href'));
		if (comment != null) {
			var nextToolbar = this.toolbar.next('.cToolbar:not([class~=commentInBody])');
			if (Object.isElement(nextToolbar)) {
				var form = nextToolbar.down('form');
				if (Object.isElement(form)) {
					form.addClassName('replyInBody' + comment[1]).scrollTo().focusFirstElement();
				}
			}
		}
	}
});

var subscribeComment = Class.create({
	entryId: null,
	container: null,
	containers: null,
	disable: false,
	initialize: function(entryId) {
		this.entryId = entryId;
		this.container = $$('.commentSubscribe').first();
		this.containers = $$('.commentSubscribe');

		//this.container.observe('click', this.toggle.bindAsEventListener(this));

		this.containers.invoke('observe', 'click', this.toggle.bindAsEventListener(this))
	},
	toggle: function(e) {
		Event.stop(e);

		if(this.disable || Event.element(e).tagName.toLowerCase() != "i"){return;}
		this.disable = true;

		if(this.container.hasClassName('addCommentSubscribe')){
			this._addSubscribe();
		}
		else{
			this._delSubscribe();
		}
		
	},
	_addSubscribe: function() {
		obj = this;
		new Ajax.Request('/webservices/commentsubscribe/', {
			method: 'post',
			parameters: {type: 'add', entry: obj.entryId},
			onComplete: function(response) {
				var data = response.responseText.evalJSON();
				if (data.status == "ok") {
					obj.containers.each(function(e) {
						e.addClassName('delCommentSubscribe').removeClassName('addCommentSubscribe');
					});
				}
				obj.disable = false;

			}
		});
	},
	_delSubscribe: function() {
		obj = this;
		new Ajax.Request('/webservices/commentsubscribe/', {
			method: 'post',
			parameters: {type: 'delete', entry: obj.entryId},
			onComplete: function(response) {
				var data = response.responseText.evalJSON();
				if (data.status == "ok") {
					obj.containers.each(function(e) {
						e.addClassName('addCommentSubscribe').removeClassName('delCommentSubscribe');
					});
				}
				obj.disable = false;

			}
		});
	}
});


var Ban = {
	_template : '<form name="form_#{id}" action="/webservices/commentdelete"><input type="hidden" name="id" value="#{id}" /><ul>' +
		'<li><label><input type="radio" name="del" value="1" />без извещения</label></li>' +
		'<li><label><input type="radio" name="del" value="2" />с извещением</label></li>' +
		'<li>' +
			'<label><input type="radio" name="del" value="3" />забанить</label>' +
			'<dl style="display: none;">' +
				'<dt>от кого:</dt>' +
				'<dd class="who">',
	_templateA1 : '<input type="hidden" id="who_hidden_#{id}" name="who" value="#{value}" />#{name}',
	_templateA : '<input type="hidden" id="who_hidden_#{id}" name="who" value="" />' +
					'<input name="who_name" id="who_auto_#{id}" autocomplete="off" size="35" type="text" value="" />',
	_templateB : '</dd>' +
				'<dt>где:</dt>' +
				'<dd class="where">' +
					'<label><input type="radio" name="where" value="0" />везде</label>',
	_templateC1 : '<label><input type="radio" name="where" value="1" />в разделе</label>',
	_templateC2 : '<label><input type="radio" name="where" value="2" />в посте</label>',
	_templateC : '<label><input type="radio" name="where" value="3" />по автору</label>',
	_templateD : '</dd>' +
				'<dt>на срок:</dt>' +
				'<dd class="days"><input type="text" size="3" maxlength="2" name="period" /> <span>дней</span></dd>' +
			'</dl>' +
		'</li>' +
		'<li><button disabled="disabled">Выполнить</button></li>' +
	'</ul></form>',
	_templateSugest : '<div class="autocomplete" id="who_list_#{id}" style="display: none"></div>',
	show : function (id) {
		banType = banType || {};
		id = id || '';
		var element = $(id);
		
		if (element) {
			if (!element.down('form')) {
				var template = Ban._template;
				if (!Object.isUndefined(banType.a)) {
					template += Ban._templateA1.interpolate({ value : banType.a, name : banType.n });
				} else {
					template += Ban._templateA;
				}
				template += Ban._templateB;
				if (Object.isUndefined(banType.c)) {
					template += Ban._templateC1;
				}
				template += Ban._templateC2;
				if (!Object.isUndefined(banType.w)) {
					template += Ban._templateC;
				}
				template += Ban._templateD;
				
				id = id.replace('viewMode_', '');
				element.down('span').insert({after : template.interpolate({ id : id})});
				element.down('button').observe("click", confirmation.confirm.bindAsEventListener(confirmation, Ban.onBan.bind(Ban, id), "deleteQuotationMessage"));
				element.select('input[name=del]').invoke("observe", "click", Ban.groupClick.bindAsEventListener(Ban, id));
				
				if (Object.isUndefined(banType.a)) {
					document.body.insert({bottom : Ban._templateSugest.interpolate({ id : id})});
					new Ajax.Autocompleter(
						"who_auto_" + id, 
						"who_list_" + id, 
						"/webservices/sugestperson", 
						{
							paramName: "who_name", 
							afterUpdateElement : function (text, li) {
								$("who_hidden_" + id).value = li.id; 
							}, 
							minChars: 2
						}
					);
				}
			}
			element.up('div.comment').setStyle({zIndex : element.hasClassName('hover') ? '1001' : '99'});
		}
	},
	groupClick : function (e, id) {
		var element = Event.findElement(e, 'li');

		$('viewMode_' + id).down('dl').hide();
		var el = $(element).down('dl');
		if (el) {
			el.show();
		}

		var btn = $('viewMode_' + id).down('button');
		if (btn.disabled) {
			btn.disabled = false;
		}
	},
	onBan : function (id) {
		var element = $('viewMode_' + id);
		if (element) {
			var form = element.down('form');
			
			form.request({
				method: 'get',
				onComplete: function (data) {
					var element = $('comment' + id);
					if(element) {
						element.remove();
					}
				}
			});
		}
	}
}; 