// BEGIN: Класс Системы комментариев

var ComSystem = {
	// Класс конфигурации
	Settings : function() {
		this.baseContainerName = "#comment_system";
		this.mainFormContainerName = "#main_form";
		this.tplFormContainerName = "#message_form";
		this.listContainerName = "#comment_list";
		
		this.delay = 3;
		
		this.isAuth = false;
		this.countMsg = 0;
		this.strWaterMark = "";
		
		this.timeAnswerHideAll = 100;
		this.timeAnswerHideLinks = 50;
		this.timeAnswerShowBlock = 500;
		this.timeCancelShowLinks = 50;
		this.timeCancelHideBlock = 250;
		
		this.timeAlertView = 3000;
	},
	
	// Дефолтная конфигурация
	config : null,
	
	// Объекты контейнеров
	baseContainer : null,
	tplFormContainer : null,
	mainFormContainer : null,
	listContainer : null,
	
	// Стартовый метод (запускается только один раз)
	start : function (cnfg) {
		// BEGIN: Установка конфигурации
		if (typeof cnfg == 'object')
			this.config = cnfg;
		if(this.config == null)
			this.config = new this.Settings();
		// END: Установка конфигурации
		
		$.post(
		    "/comments/getCommentSystem/",
		    { 
		        url: location.pathname,
		        title: $("title").html() 
		    }, 
		    function(data){
		        var messageList = $(ComSystem.config.listContainerName).html();
		        $(ComSystem.config.baseContainerName).html(data);
		        $(ComSystem.config.listContainerName).html(messageList);
		        ComSystem.setConteiners();
		        ComSystem.init();
		    }
		);
	},
	
	// Установка контейнеров
	setConteiners : function() {
		this.baseContainer = $(this.config.baseContainerName);
		this.tplFormContainer = $(this.config.tplFormContainerName);
		this.mainFormContainer = $(this.config.mainFormContainerName);
		this.listContainer = $(this.config.listContainerName);
		this.baseContainer.addClass("comment_system");
		// BEGIN: Установка некоторых значений в конфиге
		this.config.isAuth = this.tplFormContainer.find(".comment_is_auth:first").val() == "false" ? false : true;
		this.config.strWaterMark = this.tplFormContainer.find(".comment_message:first").val();
		// END: Установка некоторых значений в конфиге
	},
	
	// Инициализация
	init : function() {
		
		// BEGIN: Установка главной формы
		this.mainFormContainer.html(this.tplFormContainer.html());
		this.setFormEvents(this.mainFormContainer.find("form:first"));
		// END: Установка главной формы
		
		// BEGIN: Установка счетчика
		this.setCounter();
		// END: Установка счетчика
		
		/*/ BEGIN: Установка таймера
	    if (!this.config.isAuth) {           
	        this.mainFormContainer.find(".comment_timer").html(this.config.delay);
	        this.mainFormContainer.find(".comment_email").attr("disabled", "disabled"); 
	        this.mainFormContainer.find(".comment_message").attr("disabled", "disabled");
	        this.mainFormContainer.find(".comment_send").attr("disabled", "'disabled");
	        this.timer();
	    }
		// END: Установка таймера*/
		
		// BEGIN: Инициализация обработчиков событий и дополнительных тегов
		this.initDD(this.listContainer);
		this.listContainer.find("dt").each(function(index) {
			ComSystem.initDT($(this));
			});
		// BEGIN: Инициализация обработчиков событий и дополнительных тегов
	}, 
	
	// Установка счетчика
	setCounter : function() {
		this.config.countMsg = this.baseContainer.find("dd").length;
		if(this.config.countMsg > 0) {
			if(this.baseContainer.find("h2 b").length == 0)
				this.baseContainer.find("h2").append("<b></b>");
			this.baseContainer.find("h2 b").html(this.config.countMsg);
		} else
			this.baseContainer.find("h2 b").hide();
	},

	// Установка обработчиков на события связанные с формой
	setFormEvents : function(formObj) {
		formObj.submit(function(){
			var id = 0;
			id = $(this).find(".comment_id").val();; 
	        var message = $(this).find(".comment_message").val();  
	        var email = (ComSystem.config.isAuth==false) ? $(this).find('.comment_email').val() : "";    
			var name = (ComSystem.config.isAuth==false) ? $(this).find('.comment_name').val() : "";    
	        ComSystem.sendMessage(message, email, name, id, $(this)); 
	        return false;
	    });
		formObj.find(".comment_message").focus(function(){
			if ($(this).val() == ComSystem.config.strWaterMark)
				$(this).css({color:"#000"}).val("");
		}).blur(function(){
			if ($(this).val() == "")
				$(this).css({color:"#ccc"}).val(ComSystem.config.strWaterMark);
		});
		formObj.find(".comment_cancel").click(function(){
			var dd = $(this).closest('dd');
			dd.find('div.links').slideDown(ComSystem.config.timeCancelShowLinks);
	        dd.find('.answer_block').slideUp(ComSystem.config.timeCancelHideBlock);
	        return false;
	    });
	},
	
	// Установка всего необходимого для элемента dt
	initDT : function(dtObj) {
		dtObj.append('<span class="' + this.getRandomAvaCss() + '"></span>');
		if($.browser.msie && $.browser.version == "6.0")
			dtObj.pngFix();
	},
	
	// Установка всего необходимого для элемента dd
	initDD : function(ddObj) {

		// BEGIN: Установка обработчиков наведения мыши
		if(ddObj.get(0) != null && ddObj.get(0).tagName.toLowerCase() != "dd")
		{
			ddObj.find("dd").mouseout(function(){
				$(this).find("ul.links").hide();
				$(this).find("a.comment_anchor").hide();
			}).mouseover(function(){
				$(this).find('ul.links').show();
				$(this).find("a.comment_anchor").show();
			});
		}
		else
		{
			ddObj.mouseout(function(){
				$(this).find("ul.links").hide();
				$(this).find("a.comment_anchor").hide();
			}).mouseover(function(){
				$(this).find('ul.links').show();
				$(this).find("a.comment_anchor").show();
			});
		}
		// END: Установка обработчиков наведения мыши
		
		// BEGIN: Установка обработчика на клик по кнопке ответить
		ddObj.find(".answer").click(function(){
			ComSystem.listContainer.find(".answer_block").filter(function (index) {
                  return $(this).css("display") != "none";
                }).slideUp(ComSystem.config.timeAnswerHideAll);
			ComSystem.listContainer.find("div.links").show();
			var ddObj = $(this).closest('dd');
			if(ddObj.find(".answer_block").length == 0) {
				ddObj.append('<div class="' + (ComSystem.config.isAuth?'answer_block answer_block_isauth':'answer_block') + '">' + ComSystem.tplFormContainer.html() + '</div>' );
				ddObj.find(".comment_send").html("<b>Ответить</b>");
				ddObj.find(".comment_id").val(ddObj.attr("id").replace(/[^0-9]/g, ""));
				ComSystem.setFormEvents(ddObj.find("form:first"));
			}
			ddObj.find("div.links").slideUp(ComSystem.config.timeAnswerHideLinks);
			ddObj.find(".answer_block").slideDown(ComSystem.config.timeAnswerShowBlock);
			//delay = 2;
			return false;
	    });
		// END: Установка обработчика на клик по кнопке ответить
		
		// BEGIN: Установка обработчика на клик по кнопке пожаловаться
		ddObj.find(".complain").click(function(){
	        var id = $(this).closest("dd").attr("id").replace(/[^0-9]/g, ""); 
			var msgObj = $(this).closest("dd").find(".msg:first");
			if(msgObj.find(".loading").length == 0)
				msgObj.append('<span class="loading"></span>');
			msgObj.find(".loading").css({
										left: ((msgObj.width()/2)-25) + "px",
										bottom: ((msgObj.height()/2)-25) + "px"
										}).show(); 
	        $.post(
	            "/comments/complain/",
	            { id: id }, 
	            function(data){     
					var ss = data.split("\n");
					var complainObj = ComSystem.listContainer.find("#c"+ss[0]+" .msg:first");
					complainObj.find('.loading').hide(); 
                    ComSystem.tooltip(ss[1], "alert", complainObj);
	            }
	        );
	        return false;       
	    });
		// END: Установка обработчика на клик по кнопке пожаловаться
		
		// BEGIN: Установка дополнительных тегов в комментарии для дизайна
		ddObj.find(".msg").append('<u></u>');
		ddObj.find(".msg a.comment_anchor").append('<cite class="tooltip"><del><b>Постоянная ссылка на комментарий<i></i></b></del></cite>');
		// END: Установка дополнительных тегов в комментарии для дизайна
		
		if($.browser.msie && $.browser.version == "6.0")
			ddObj.pngFix();
	},
	
	// Таймер 
	timer : function() {
	    this.baseContainer.everyTime(1000, function(i) {
	        ComSystem.mainFormContainer.find(".comment_timer").html(ComSystem.config.delay);
	        if (ComSystem.config.delay == 0) {
				ComSystem.baseContainer.find(".comment_email").attr("disabled", "");  
	            ComSystem.baseContainer.find(".comment_message").attr("disabled", "");
	            ComSystem.baseContainer.find(".comment_send").attr("'disabled", "");
	        }
	        if (ComSystem.config.delay > 0)
	        	ComSystem.config.delay--;
	    });
	},
	
	// Проверяет и правильность данных и отсылает сообщение на сервер
	sendMessage : function (message, email, name, id_parent, formObj) {  
		var complainObj = null;
		if (!this.config.isAuth) {
			complainObj = formObj.find(".comment_email_error");
	        if (!this.checkmail(email)) {
				complainObj.removeClass().addClass("comment_email_error comment_error_yes");
	            this.tooltip("Пожалуйста, введите корректный адрес электронной почты", "error", complainObj.find(".comment_error_right"));
	            return false;
	        }
			else
				complainObj.removeClass().addClass("comment_email_error comment_error_no");
				
			complainObj = formObj.find(".comment_name_error");
			if (name == "") {
				complainObj.removeClass().addClass("comment_name_error comment_error_yes");
	            this.tooltip("Пожалуйста, введите ваше имя", "error", complainObj.find(".comment_error_right"));
	            return false;
	        }
			else
				complainObj.removeClass().addClass("comment_name_error comment_error_no");
	    }
		
		complainObj = formObj.find(".comment_message_error");
	    if (message.length == 0 || message == this.config.strWaterMark) {
			complainObj.removeClass().addClass("comment_message_error comment_error_yes");
	        this.tooltip("Введите текст сообщения", "error", complainObj.find(".comment_error_right"));
	        return false;
	    }
		else
			complainObj.removeClass().addClass("comment_message_error comment_error_no");

		$("input.comment_name").val(name);
		$("input.comment_email").val(email);
		if(formObj.find(".loading").length == 0)
				formObj.append('<span class="loading"></span>');
	    		formObj.find('.loading').css({
										left: ((formObj.width()/2)-25) + "px",
										bottom: ((formObj.height()/2)-25) + "px"
										}).show();        
	    jQuery.post(
	        "/comments/sendMessage/",
	        { 
	            message: message,
	            email: email,
				name: name,
	            url: location.pathname,
	            id_parent: id_parent
	        }, 
	        function(data){
				//alert(data);
				var ss = data.split("\n");
				
				// BEGIN: Инициализация необходимых переменных
				var ddObj = null;
				var formContainerObj = null;
				var parentID = ss[0];
				var newID = ss[1];
				var msgHTML = "";
				for(i=2; i<ss.length; i++)
					msgHTML += ss[i] + "\n";
				// END: Инициализация необходимых переменных
				
				// BEGIN: Получение контейнера родителя и формы откуда шло добавление
				if(parentID == "") {
					if(ComSystem.config.countMsg > 0)
						ddObj = ComSystem.listContainer.find("dd:last");
					formContainerObj = ComSystem.mainFormContainer;
				}
				else {
					ddObj = ComSystem.listContainer.find("#c"+parentID);
					formContainerObj = ddObj;
				}
				// END: Получение контейнера родителя и формы откуда шло добавление
				
				// BEGIN: Скрываем форму
				formContainerObj.find("form .loading").hide(); 
				if(parentID != "")
					formContainerObj.find("form .comment_cancel").click();
				formContainerObj.find("form .comment_message").val(""); 
				// BEGIN: Скрываем форму
				
				// BEGIN: Вставляем переданный HTML после родительского
				if(ComSystem.config.countMsg > 0)
					ddObj.after(msgHTML);
				else
					ComSystem.listContainer.append(msgHTML)
				var newDT = ComSystem.listContainer.find("dt#comment"+newID+":first");
				var newDD = ComSystem.listContainer.find("dd#c"+newID+":first");
				ComSystem.initDT(newDT);
				ComSystem.initDD(newDD);
				// END: Вставляем переданный HTML после родительского
				
				// BEGIN: Обновляем счетчик
				ComSystem.setCounter();
				// END: Обновляем счетчик
	        }
	    );
	},

	// Замена списка сообщений новым актуальным списком
	replaceMessageList : function () {           
	    jQuery.post(
	        "/comments/getMessageList/",
	        { 
	            url: location.pathname
	        },
	        function(data){
	            ComSystem.listContainer.html(data);   
	            ComSystem.init();
	        }
	    );    
	},
	
	//Отображает тултип
	tooltip : function (text, type, parentObj) {
		if (typeof text == "string" && typeof type == "string" && typeof parentObj == "object" && parentObj != null)
		{
			if(type == "alert" || type == "error")
			{
				var tooltipCSSClass = type=="error" ? "tooltip error" : "tooltip";
				if(parentObj.find("span.alert-complain cite.tooltip").length == 0)
					parentObj.append('<span class="alert-complain"><cite class="' + tooltipCSSClass + '"><del><b></b></del></cite></span>');
				parentObj.find("span.alert-complain cite.tooltip del b").html(text + "<i></i>");
				parentObj.find("span.alert-complain cite.tooltip").show().animate({left:"+=0"}, this.config.timeAlertView, function() {  $(this).hide(); });
			}
		}
		else if (typeof text == "string")
			alert(text);
	},
	
	// Является ли строка e-mail'ом
	checkmail : function (value) {
		var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
		return reg.test(value);
	},
	
	// Получение случайного css класса для рамки аватарки
	getRandomAvaCss : function() {
		var Xmin = 1;
		var Xmax = 5;
		var X =  Math.floor(Math.random() * (Xmax - Xmin + 1)) + Xmin;
		return "avaframe avaframe" + X;
	}
	
};
// END: Класс Системы комментариев


$(document).ready(function(){
	//Проверка, включен ли модуль комментариев в config.php            
	$.post(
		"/comments/is_enable/",
		{}, 
		function(data){   
			if (data == "true")
				ComSystem.start();
		}
	);
});

