function Forum() {
	this.itemsData = null;
	this.failedLogins = 0;
	this.required = {
		'auth' : {
			'username'		: 'Не указано имя пользователя',
			'password'		: 'Вы забыли указать пароль',
			'keystring'		: 'Вы точно не робот? Введите контрольное слово'
		},
		'addUser' : {
			'user'			: 'Не указано имя пользователя',
			'password'		: 'Вы забыли указать пароль',
			'email'			: 'Пожалуйста, укажите свой e-mail',
			'keystring'		: 'Вы точно не робот? Введите контрольное слово'
		},
		'addTopic' : {
			'topicTitle'	: 'Пожалуйста, укажите заголовок создаваемой темы',
			'topicMessage'	: 'Вы ничего не написали в сообщении'
		},
		'addMessage' : {
			'NewMessage'	: 'Вы ничего не написали в сообщении'
		}
	};

	this.init = function() {
		var self = this;
		$('.link_ForumLogin').live('click', function() {
			$('#LoginForm').fadeIn(200, function(){
				$('#username').focus();			
			});
			return false;
		});
		$('.link_CloseLoginForm').live('click', function() {
			$('#LoginForm').fadeOut(200);
			return false;
		});
		$('#button_Auth').live('click', function() {
			$('form#authForm').submit();
			return false;
		});
		$('form#authForm').bind('submit', function() {
			self.RouteAuth();
			return false;
		});

		$('#button_AddMessage').live('click', function() {
			self.AddMessage();
			return false;
		});
		$('.messagePics li').live('mouseover', function() {
			self.ShowDeleteMessagePicLink($(this));
		});
		$('.messagePics li').live('mouseout', function() {
			self.HideDeleteMessagePicLink($(this));
		});

		$('.link_DeleteMessagePic').live('click', function() {
			self.DeleteMessagePic($(this));
			return false;
		});

		$('.link_AddTopic').live('click', function() {
			$('#NewTopic').fadeIn(200);
			return false;
		});
		$('.link_CloseAddTopicForm').live('click', function() {
			$('#NewTopic').fadeOut(200);
			return false;
		});
		$('#button_AddTopic').live('click', function() {
			self.AddTopic();
			return false;
		});
		$('#button_AddUser').live('click', function() {
			self.AddUserAfterCheckingCaptcha();
			return false;
		});
		$('#button_EditUser').live('click', function() {
			self.EditUser();
			return false;
		});
		// показ формы редактирования сообщения
		$('.link_EditMessage').live('click', function() {
			self.ShowEditMessageForm($(this));
			return false;
		});
		// редактирование сообщения
		$('.button_EditMessage').live('click', function() {
			self.EditMessage($(this));
			return false;
		});
		$('.button_EditMessageCancel').live('click', function() {
			self.HideEditMessageForm($(this));
			return false;
		});

		// проверка уникальности логина
		$('#user').bind('blur', function() {
			self.CheckLogin($(this).val());
			return false;
		});
		// сброс картинки
		$('#link_ResetPicture').bind('click', function() {
			self.ResetPicture();
			return false;
		});
		// загрузка картинки
		self.InitPictureUploader();
		self.InitMessagePictureUploader();
	};

	// Проверка заполненности обязательных полей
	this.CheckRequired = function(section) {
		var required = null;
		if (section == 'auth')
			required = Forum.required.auth;
		if (section == 'addTopic')
			required = Forum.required.addTopic;
		if (section == 'addUser')
			required = Forum.required.addUser;
		if (section == 'addMessage')
			required = Forum.required.addMessage;

		for (var i in required) {
			var curValue = document.getElementById(i).value;
			if (/^(\s)*$/.test(curValue)) {
				alert(required[i]);
				return false;
			}
		}

		return true;
	};

	this.RouteAuth = function() {
		if (this.failedLogins < 5) {
			if ($('#captcha').is(':visible'))
				this.AuthAfterCheckingCaptcha();
			else
				this.Auth();
		} else {
			alert('Судя по всему, вы не можете вспомнить свой пароль.\nНапишите на admin@gwcr.ru, будем вспоминать вместе');
			$('#LoginForm').fadeOut(300);
			this.failedLogins = 0;
		}
	};

	// Авторизация на форуме
	this.Auth = function() {
		$('#button_Auth').addClass('loading').attr('disabled', 'disabled');

		var url = '/?daemon=login';
		var username = $('#username').val();
		var password = hex_md5($('#password').val());
setTimeout(function() { // DEBUG имитация лага при загрузке
		$.ajax({
			url: url,
			data : { 'username':username, 'password':password },
			dataType : "json",
			type : "post",
			success: function(json) {
				if (json.auth == 'true') {
					setTimeout(function() {
						$('#LoginForm').fadeOut(200);
						// var port = window.location.port ? ':' + window.location.port : '';
						// var url = 'http://' + window.location.hostname + port + '/';
						// window.location.href = '/forum/';
						window.location.reload(true);
					}, 500);
				} else {
					$('#button_Auth').removeClass('loading').removeAttr('disabled');
					alert('Неправильный логин/пароль');
					Forum.failedLogins++;
					$('#captcha').show();
				}
			},
			error: function() {
				alert('Error loading json while trying to login');
			}
		});
}, 0);
	};

	// Проверка каптчи с последующей авторизацией
	this.AuthAfterCheckingCaptcha = function() {
		if (!this.CheckRequired('auth'))
			return false;

		$('#button_Auth').addClass('loading').attr('disabled', 'disabled');

		var url = SITE_URL + 'index.phtml?daemon=forum';
		var keystring = $('#keystring').val();
setTimeout(function() { // DEBUG имитация лага при загрузке
		$.ajax({
			url: url,
			data : { 'action':'checkCaptcha', 'keystring':keystring },
			dataType : "json",
			type : "post",
			success: function(json) {
				if (json.passed == 1) {
					Forum.Auth();
				} else {
					alert('Неверно введено контрольное слово');
					$('#keystring').focus().empty();
					$('#button_Auth').removeClass('loading').removeAttr('disabled');
				}
			},
			error: function() {
				alert('Error loading json while trying to check captcha');
			}
		});
}, 0);
	};

	// Добавление сообщения
	this.AddMessage = function() {
		$('#button_AddMessage').addClass('loading').attr('disabled', 'disabled');

		var url = SITE_URL + 'index.phtml?daemon=forum';
		var message = $('#NewMessage').val();
		var topicId = $('#NewMessageForm input[name="topicId"]').val();
		var userId = $('#NewMessageForm input[name="userId"]').val();
		var dateTime = 0;
		var picsStr = Forum.getLoadedPicturesStr($('#messagePics .link_DeleteMessagePic'));

setTimeout(function() { // DEBUG имитация лага при загрузке
		$.ajax({
			url: url,
			data : { 'message':message, 'topicId':topicId, 'userId':userId, 'dateTime':dateTime, 'picsStr': picsStr, 'action':'addMessage' },
			dataType : "json",
			type : "post",
			success: function(json) {
				$('#NewMessage').val('');
				$('#button_AddMessage').removeClass('loading').removeAttr('disabled');
				if (json.error == 'true') {
					alert('Не удалось добавить сообщение, попробуйте позже');
				} else {
					alert('Сообщение добавлено');
					$('#messagePics > ul').empty();

					$('#MessagesList > li:last').after(json.DOMElement);
					var newElem = $('#MessagesList > li:last');
					newElem.hide().slideDown(300);
					newElem.children('a.zoom1').fancybox({
						'zoomSpeedIn'		:	500,
						'zoomSpeedOut'		:	500
					});
					// $('#NewMessage').empty();
				}
			},
			error: function() {
				alert('Error loading json while trying to add new message');
			}
		});
}, 0);
	};

	// Получаем строку из имен всех загруженных картинок
	this.getLoadedPicturesStr = function(jqImgs) {
		var pictures = new Array();

		jqImgs.each(function(){
			var pic = $(this).attr('fileName');
			var thumb = 'thumb_'+pic;
			pictures.push(pic);
			pictures.push(thumb);
		});

		var picsStr = pictures.join('|');
		return picsStr == '' ? false : picsStr;
	};

	// ссылка для удаления загруженной картинки
	this.ShowDeleteMessagePicLink = function(jqObj) {
		//jqObj.wrap('<div class="DeletePic_wrapper"></div>');
		//jqObj.after('<a class="link_DeleteMessagePic" title="удалить изображение"></a>');
	};
	this.HideDeleteMessagePicLink = function(jqObj) {
		//jqObj.parent().children('.link_DeleteMessagePic').remove();
		// jqObj.unwrap();
	};

	// удаление изображения в сообщении
	this.DeleteMessagePic = function(jqObj) {

		var url = SITE_URL + 'index.phtml?daemon=forum';
		var messageId = jqObj.attr('messageId');
		var fileName = jqObj.attr('fileName');
		var isTmp = 0;
		if (jqObj.parent().parent().parent().attr('id') == 'messagePics')
			isTmp = 1;
		var action = 'deletePicture';

setTimeout(function() { // DEBUG имитация лага при загрузке
		$.ajax({
			url: url,
			data : { 'messageId':messageId, 'fileName':fileName, 'isTmp':isTmp, 'action':action },
			dataType : "json",
			type : "post",
			success: function(json) {
				if (json.error == 'true') {
					alert('Не удалось удалить фотографию. Напишите админу на admin@gwcr.ru, он починит');
				} else {
					jqObj.parent().fadeOut(300, function(){
						$(this).remove();
					});
				}
			},
			error: function() {
				alert('Error loading json while trying to delete message pic');
			}
		});
}, 0);

	};

/*
	// Проверка каптчи с последующим добавлением сообщения
	this.AddMessageAfterCheckingCaptcha = function() {
		if (!this.CheckRequired('addMessage'))
			return false;

		$('#button_AddMessage').addClass('loading').attr('disabled', 'disabled');

		var url = SITE_URL + 'index.phtml?daemon=forum';
		var keystring = $('#keystring').val();
setTimeout(function() { // DEBUG имитация лага при загрузке
		$.ajax({
			url: url,
			data : { 'action':'checkCaptcha', 'keystring':keystring },
			dataType : "json",
			type : "post",
			success: function(json) {
				if (json.passed == 1) {
					Forum.AddMessage();
				} else {
					alert('Неверно введено контрольное слово');
					$('#keystring').focus().empty();
					$('#button_AddMessage').removeClass('loading').removeAttr('disabled');
				}
			},
			error: function() {
				alert('Error loading json while trying to check captcha');
			}
		});
}, 0);
	};
*/
	// Показ формы редактирования сообщения
	this.ShowEditMessageForm = function(jqElem) {
		var tgt = jqElem.attr('tgt');
		$('#'+tgt).parent().hide(); // прячем текст сообщения
		jqElem.hide();				// и ссылку "редактировать"

		var wrapper = jqElem.parent().children('.wrapper_EditMessage');
		wrapper.show(); // показываем форму редактирования
		wrapper.children('textarea').focus();										

		return false;
	};

	// Скрытие формы редактирования сообщения
	this.HideEditMessageForm = function(jqElem) {
		jqElem.parent().parent().children('.text, .link_EditMessage').show();
		jqElem.parent().hide();
		return false;
	};

	// Редактирование сообщения
	this.EditMessage = function(jqElem) {
		var message = jqElem.parent().children('textarea').val();
		jqElem.addClass('loading').attr('disabled', 'disabled');

		var url = SITE_URL + 'index.phtml?daemon=forum';
		var topicId = $('#NewMessageForm input[name="topicId"]').val();
		var userId = $('#NewMessageForm input[name="userId"]').val();
		var dateTime = jqElem.parent().children('input[name="date"]').val();
		var jqPicsDataHolder = jqElem.parent().parent().find('.messagePics .link_DeleteMessagePic');
		var picsStr = Forum.getLoadedPicturesStr(jqPicsDataHolder);

setTimeout(function() { // DEBUG имитация лага при загрузке
		$.ajax({
			url: url,
			data : { message:message, topicId:topicId, userId:userId, dateTime:dateTime, picsStr:picsStr, action:'addMessage' },
			dataType : "json",
			type : "post",
			success: function(json) {
				if (json.error == 'true') {
					alert('Не удалось отредактировать сообщение, возможно стоит попытать счастья чуть позже');
				} else {
					$('#MessagesList .wrapper_EditMessage').filter(':visible').hide();
					var par = jqElem.parent().parent();
					par.children('.text').html('<a name="'+json.id+'" id="'+json.id+'"></a>'+message).show();
					par.children('.link_EditMessage').attr('tgt', json.id).show();
					jqPicsDataHolder.each(function(){
						$(this).attr('messageId', json.id);
						$(this).parent().children('.zoom1').attr('rel', 'gallery'+json.id);
					});
					alert('Сообщение отредактировано');
				}
				$('.button_EditMessage').removeClass('loading').removeAttr('disabled');
			},
			error: function() {
				alert('Error loading json while trying to edit message');
				$('.button_EditMessage').removeClass('loading').removeAttr('disabled');
			}
		});

}, 0);

		return false;
	};

	// Создание новой темы
	this.AddTopic = function() {
		if (!this.CheckRequired('addTopic'))
			return false;

		$('#NewTopicForm').addClass('loading');

		var url = SITE_URL + 'index.phtml?daemon=forum';
		var title = $('#topicTitle').val();
		var message = $('#topicMessage').val();
		var sectionId = $('#NewTopicForm input[name="sectionId"]').val();
		var userId = $('#NewTopicForm input[name="userId"]').val();

setTimeout(function() { // DEBUG имитация лага при загрузке
		$.ajax({
			url: url,
			data : { 'title':title, 'message':message, 'sectionId':sectionId, 'userId':userId, 'action':'addTopic' },
			dataType : "json",
			type : "post",
			success: function(json) {
				$('#topicTitle').val('');
				$('#topicMessage').val('');
				$('#NewTopicForm').removeClass('loading').hide();

				if (json.error == 'true') {
					$('#NewTopicFail').fadeIn(200);
				} else {
					$('#NewTopicSuccess').fadeIn(200);
					$('#TopicsList tr:first').after(json.DOMElement);
					setTimeout(function() {
						$('#NewTopic').fadeOut(200, function(){
							$('#NewTopicFail').hide();
							$('#NewTopicSuccess').hide();
							$('#NewTopicForm').show();
						})
					}, 1000);
				}
			},
			error: function() {
				alert('Error loading json while trying to add new topic');
			}
		});
}, 0);

	};
/*
	// Проверка каптчи с последующим созданием новой темы
	this.AddTopicAfterCheckingCaptcha = function() {
		if (!this.CheckRequired('addTopic'))
			return false;

		$('#button_AddTopic').addClass('loading').attr('disabled', 'disabled');

		var url = SITE_URL + 'index.phtml?daemon=forum';
		var keystring = $('#keystring').val();
setTimeout(function() { // DEBUG имитация лага при загрузке
		$.ajax({
			url: url,
			data : { 'action':'checkCaptcha', 'keystring':keystring },
			dataType : "json",
			type : "post",
			success: function(json) {
				if (json.passed == 1) {
					Forum.AddTopic();
				} else {
					alert('Неверно введено контрольное слово');
					$('#keystring').focus().empty();
					$('#button_AddTopic').removeClass('loading').removeAttr('disabled');
				}
			},
			error: function() {
				alert('Error loading json while trying to check captcha');
			}
		});
}, 0);
	};
*/
	// Добавление/редактирование пользователя
	this.EditUser = function() {
		var url = SITE_URL + 'index.phtml?daemon=forum';

		var userData = Forum.GetEditUserData();
		var mode = $('#editMode').val();
		userData.action = (mode == 'add') ? 'addUser' : 'editUser';

setTimeout(function() { // DEBUG имитация лага при загрузке
		$.ajax({
			url: url,
			data : userData,
			dataType : "json",
			type : "post",
			success: function(json) {
				$('#UserEditForm').hide();
				if (json.error == 'true') {
					$('#RegistrationFailed, #EditFailed').fadeIn(200);
				} else {
					$('#RegistrationCompleted, #EditCompleted').fadeIn(200);
					var pic = '/uploads/forum/users/';
					if (userData.picture != '')
						pic = pic+userData.picture;
					else
						pic = pic+'unknown_hero.jpg';
					$('#nanoPic').attr('src', pic);
				}
			},
			error: function() {
				alert('Error loading json while trying to edit/add user');
				$('#UserEditForm').hide();
				$('#RegistrationFailed').fadeIn(200);
			}
		});
}, 0);
	};

	// Проверка каптчи с последующим созданием нового пользователя
	this.AddUserAfterCheckingCaptcha = function() {
		if (!this.CheckRequired('addUser'))
			return false;

		$('#button_EditUser').addClass('loading').attr('disabled', 'disabled');

		var url = SITE_URL + 'index.phtml?daemon=forum';
		var keystring = $('#keystring').val();
setTimeout(function() { // DEBUG имитация лага при загрузке
		$.ajax({
			url: url,
			data : { 'action':'checkCaptcha', 'keystring':keystring },
			dataType : "json",
			type : "post",
			success: function(json) {
				if (json.passed == 1) {
					Forum.EditUser();
				} else {
					alert('Неверно введено контрольное слово');
					$('#keystring').focus().empty();
					$('#button_EditUser').removeClass('loading').removeAttr('disabled');
				}
			},
			error: function() {
				alert('Error loading json while checking your human origin');
			}
		});
}, 0);
	};

	// Сбор введенной информации о пользователе
	this.GetEditUserData = function() {
		function getPwd() {
			if ($('#password').val() != '')
				return hex_md5($('#password').val());
			else
				return '';
		}
		function User() {
			this.user			= $('#user').val();
			this.userId			= $('#userId').val();
			this.picture		= $('#picture').val();
			this.password		= getPwd();
			this.userFullName	= $('#userFullName').val();
			this.email			= $('#email').val();
			this.web			= $('#web').val();
			this.icq			= $('#icq').val();
			this.skype			= $('#skype').val();
			this.signature		= $('#signature').val();
		}
		var userData = new User();

		return userData;
	};

	// Проверка уникальности логина
	this.CheckLogin = function(login) {
		$('#messageLoginFree, #messageLoginOccupied').hide();
		var url = SITE_URL + 'index.phtml?daemon=forum';
setTimeout(function() { // DEBUG имитация лага при загрузке
		$.ajax({
			url: url,
			data : { 'action':'checkLogin', 'login':login },
			dataType : "json",
			type : "post",
			success: function(json) {
				if (json.error == 'true') {
					$('#UserEditForm').hide();
					$('#RegistrationFailed, #EditFailed').fadeIn(200);
				} else {
					if(json.userExists == false) {
						//$('#messageLoginFree').fadeIn(200);
					} else {
						$('#messageLoginOccupied').fadeIn(200);
					}
				}
			},
			error: function() {
				alert('Error loading json while trying to check login');
				$('#UserEditForm').hide();
				$('#RegistrationFailed').fadeIn(200);
			}
		});
}, 0);
	};

	// Проверка правильности введенной каптчи
	this.CheckCaptcha = function(keystring) {
		var url = SITE_URL + 'index.phtml?daemon=forum';
setTimeout(function() { // DEBUG имитация лага при загрузке
		$.ajax({
			url: url,
			data : { 'action':'checkCaptcha', 'keystring':keystring },
			dataType : "json",
			type : "post",
			success: function(json) {
				if (json.passed == 1) {
					return true;
				} else {
					return false;
				}
			},
			error: function() {
				alert('Error loading json while trying to check captcha');
			}
		});
}, 0);
	};

	// Сброс пользовательской картинки
	this.ResetPicture = function() {
		var path = SITE_URL+'uploads/forum/users/';
		var blank = 'unknown_hero.jpg'
		$('#userPic').attr('src', path+blank);
		$('#picture').val(blank);
	};

	// Загрузка пользовательской картинки
	this.InitPictureUploader = function() {
		if ($('#userPic').length != 0) {

			new AjaxUpload('button_UploadUserPic', {
			  // Location of the server-side upload script
			  // NOTE: You are not allowed to upload files to another domain
				action: '/?daemon=forum',
			  // File upload name
				name: 'userPic',
			  // Additional data to send
				data: {	action : 'loadPicture', type: 'user' },
			  // Submit file after selection
				autoSubmit: true,
			  // The type of data that you're expecting back from the server.
			  // HTML (text) and XML are detected automatically.
			  // Useful when you are using JSON data as a response, set to "json" in that case.
			  // Also set server response type to text/html, otherwise it will not work in IE6
				responseType: 'json',
			  // Fired after the file is selected
			  // Useful when autoSubmit is disabled
			  // You can return false to cancel upload
			  // @param file basename of uploaded file
			  // @param extension of that file
				onChange: function(file, extension){},
			  // Fired before the file is uploaded
			  // You can return false to cancel upload
			  // @param file basename of uploaded file
			  // @param extension of that file
				onSubmit : function(file , ext){
					$('#userPic').parent().addClass('loading');
					$('#button_EditUser').attr('disabled', 'disabled');
					if (! (ext && /^(jpg|png|jpeg|gif)$/i.test(ext))){
						$('#userPic').parent().removeClass('loading');
						$('#button_EditUser').removeAttr('disabled');
						// extension is not allowed
						alert('Ошибка: Неверный тип файла');
						// cancel upload
						return false;
					}
				},
			  // Fired when file upload is completed
			  // WARNING! DO NOT USE "FALSE" STRING AS A RESPONSE!
			  // @param file basename of uploaded file
			  // @param response server response
				onComplete: function(file, response) {
					if (response.error == 'true') {
						alert('Не удалось загрузить файл, скорее всего или он слишком большой, или изображение некорректного формата. Попробуйте загрузить другую картинку - должно сработать.');
					} else {
						var path = SITE_URL+'uploads/forum/users/tmp/';
						$('#userPic').attr('src', path+response.fileName);
						$('#picture').val(response.fileName);
						$('#userPic').parent().removeClass('loading');
						$('#button_EditUser').removeAttr('disabled');
					}
				}
			});

		}
	};

	// Загрузка картинки в сообщение
	this.InitMessagePictureUploader = function() {
		if ($('#button_UploadMessagePic').length != 0) {

			new AjaxUpload('button_UploadMessagePic', {
				action: '/?daemon=forum',
				name: 'userPic',
				data: {	action : 'loadPicture', type : 'message' },
				autoSubmit: true,
				responseType: 'json',
				onChange: function(file, extension){},
				onSubmit : function(file , ext){
					// $('#userPic').parent().addClass('loading');
					// $('#button_EditUser').attr('disabled', 'disabled');
					if (! (ext && /^(jpg|png|jpeg|gif)$/i.test(ext))){
						// $('#userPic').parent().removeClass('loading');
						// $('#button_EditUser').removeAttr('disabled');
						// extension is not allowed
						alert('Ошибка: Неверный тип файла');
						return false;
					}
				},
				onComplete: function(file, response) {
					if (response.error == 'true') {
						alert('Не удалось загрузить файл, скорее всего или он слишком большой, или изображение некорректного формата. Попробуйте загрузить другую картинку - должно сработать.');
					} else {
						var path = SITE_URL+'uploads/forum/messages/tmp/';
						var fullSrc = path+response.fileName;
						var picSrc = path+'thumb_'+response.fileName;
						var li = '<li>';
						li += '<img src="'+picSrc+'" alt="" />';
						li += '<a href="#" class="link_DeleteMessagePic" fileName="'+response.fileName+'">удалить</a>';
						li += '</li>';
						$('#messagePics > ul.messagePics').append(li);
						//$('#userPic').parent().removeClass('loading');
						//$('#button_EditUser').removeAttr('disabled');
					}
				}
			});

		}
	};

	this.init();
}

$(document).ready(function(){
	Forum = new Forum();
	//$('#NewMessage, #topicMessage').wysiwyg();
});
