var FormAnswer = new FormAnswerClass(); 

function FormAnswerClass() {
	var OldObj = null
	var OldObjButton = null
	var varIsNewForumTema = false
	var curCmd = ""
	var curActionPage = ""
	var	curParam1 = ""
	var	curParam2 = ""
	var SymbolCountMax = 3000
	var varIsGuest = false;

this.InsertAndHideLastEdit = function (objAnswerForm,objAnswerButton,actionPage,param1,param2,IsNewForumTema,Title,editText,isGuest) {
	this.InsertAndHideLast("edit",objAnswerForm,objAnswerButton,actionPage,param1,param2,Title,IsNewForumTema,isGuest)
	editText = editText.replace(/\[SQ\]/ig,"'");
	editText = editText.replace(/\[DQ\]/ig,"\"");
	editText = editText.replace(/<br>/ig,"\r\n");
	GetID("FormText").value = editText;
}

this.InsertAndHideLast = function (cmd,objAnswerForm,objAnswerButton,actionPage,param1,param2,Title,IsNewForumTema,isGuest) {
	if (OldObj != null) OldObj.innerHTML = "";
	RestoreOldDisplay();
	OldObj = objAnswerForm;
	OldObjButton = objAnswerButton;
	this.Insert(cmd,objAnswerForm,actionPage,param1,param2,Title,IsNewForumTema,isGuest)
	objAnswerForm.innerHTML = objAnswerForm.innerHTML;
	objAnswerForm.style.display = ""
	objAnswerButton.style.display = "none"
}	

this.Insert = function (cmd,objAnswerForm,actionPage,param1,param2,Title,IsNewForumTema,isGuest) {
	curParam1 = param1
	curParam2 = param2
	curCmd = cmd
	curActionPage = actionPage
	varIsGuest = isGuest
	varIsNewForumTema = IsNewForumTema
	s=""
	s=s+"<form id='FormSendMessage'>"; 
	s=s+"<img id='ConnectingImg' src='images/connecting.gif' style='display:none; position: relative; top: 120px; left: 30px;'>";

	s=s+"<br><center><table style='width:90%; height: 46px; margin:0 auto;';><tr><td style='vertical-align: middle; text-align: center; color:#000000; background:#c0c0c0; border: 1px solid #000000;'>"
	s=s+ Title + "&nbsp;"
	s=s+"(<span id='SymbolCounter'>" + SymbolCountMax + "</span>)&nbsp;&nbsp;&nbsp;"
                                      
	s=s+"<img src='images/Buttons/Bold.jpg' onmouseup='FormAnswer.InsertSimple(\"B\")' title='жирный' style='vertical-align: middle'> ";
	s=s+"<img src='images/Buttons/Italic.jpg' onmouseup='FormAnswer.InsertSimple(\"I\")' title='курсивный' style='vertical-align: middle'> ";
	s=s+"<img src='images/Buttons/UnderLine.jpg' onmouseup='FormAnswer.InsertSimple(\"U\")' title='подчеркнутый' style='vertical-align: middle'> ";
	s=s+"<img src='images/Buttons/Red.jpg' onmouseup='FormAnswer.InsertSimple(\"red\")' title='красный' style='vertical-align: middle'> ";
	s=s+"<img src='images/Buttons/Green.jpg' onmouseup='FormAnswer.InsertSimple(\"green\")' title='зеленый' style='vertical-align: middle'> ";
	s=s+"<img src='images/Buttons/Blue.jpg' onmouseup='FormAnswer.InsertSimple(\"blue\")' title='синий' style='vertical-align: middle'> ";
	s=s+"<img src='images/Buttons/Audio.jpg' onmouseup='FormAnswer.InsertMp3()' title='вставка MP3 записи из инета' style='vertical-align: middle'> ";
	s=s+"<img src='images/Buttons/Image.jpg' onmouseup='FormAnswer.InsertImg()' title='вставка изображения из инета' style='vertical-align: middle'> ";
	s=s+"<img src='images/Buttons/Link.jpg' onmouseup='FormAnswer.InsertURL()' title='вставка ссылки' style='vertical-align: middle'> ";
	s=s+"<img src='images/Buttons/Quoting.jpg' onmouseup='FormAnswer.InsertQuote()' title='вставка цитаты' style='vertical-align: middle'> ";
	s=s+"<img src='images/Buttons/Ru.jpg' onmouseup='FormAnswer.RusKeyboardShow()' border='0' title='русская клавиатура' style='vertical-align: middle'>";

	if (IsNewForumTema) s=s+"&nbsp;<img src='images/Buttons/Voting.jpg' onmouseup='FormAnswer.InsertVoite()' title='вставка 1 голоса в голосовании' style='vertical-align: middle'> ";
	if (OldObj != null) s=s+"&nbsp;&nbsp;<img src='images/Buttons/Close.jpg' onmouseup='FormAnswer.Close()' title='закрыть окно' style='vertical-align: middle'>";
	s=s+"</td></tr></table></center>"

	s=s+"<p align='center'><span id='ParametrsSpan'></span>";

	if (IsNewForumTema) s=s+"<br>	тема сообщения <input type='text' id='FormTextTitle' size='75' maxlength='100' style='margin-left: 1' class='formSmall'><br>";
	if (isGuest) {
		s=s+"<br><b>Внимание! Сообщения от гостей проходят через премодерацию и появляются не сразу!</b><br>Так же не забудьте прочитать <a href='PravilaPovedeina.php' target='_blank'>правила поведения на сайте</a><br>";
		s=s+"<b>Если Вы зарегистрированы, то <a href='login.php'>войдите на сайт</a>, нажав ВХОД вверху страницы<br>НЕ ДУБЛИРУЙТЕ СООБЩЕНИЯ ДАЖЕ ЕСЛИ ОНО НЕ ПОЯВИЛОСЬ!<br><br>";
		s=s+"Введите ваше имя гостя &nbsp;&nbsp;<input type='text' id='UserName' size='25' maxlength='25' class='formSmall'><br>"
	}
	s=s+"<textarea style='margin:5px' id='FormText' maxlength='" + SymbolCountMax + "' rows='8' cols='76' tabindex='1'></textarea><br>";
	s=s+"<span id='SmileSection'></span>&nbsp;&nbsp;&nbsp;";

	s=s+"<input id='SendButton' type='button' value='Отправить' onmouseup='FormAnswer.Send(this)'>";
	s=s+"</p>"
	s=s+"<span id='SmileCatalogSection' style='display:none; width: 98%;'></span>";
	s=s+"</form>";
	objAnswerForm.innerHTML = s
	GetID('FormSendMessage').style.display = ""
	GetID('SmileSection').innerHTML = GenerateMainSmileMap();
	setTimeout("t=GetID('FormText'); t.focus(); t.select(); FormAnswer.CheckSymbolCount(t); delTextAreaSelection('FormText'); getTextAreaSelection('FormText');",100)
}	

this.Send = function(obj) {
	var name="", msg="", tema="";
	if (varIsGuest) {
		name = GetID('UserName').value;
		if (name=="") {
			alert("Введите ваше имя!");
			return false;
		}
	}
	msg = GetID('FormText').value;
	if (msg=="") {
		alert("Введите текст сообщения!");
		return false;
	}
	if (varIsNewForumTema) {
		tema = GetID('FormTextTitle').value;
		if (tema=="") {
			alert("Введите тему сообщения!");
			return false;
		}
	}
	var s = "cmd=" + curCmd
		s = s + "&UserName=" + name
		s = s + "&param1=" + curParam1
		s = s + "&param2=" + curParam2
		s = s + "&isDecodeText=1"
		if (varIsNewForumTema) s=s + "&FormTextTitle=" + encodeURIComponent(tema) + "&"
		s = s + "&FormText=" + encodeURIComponent(msg)
	var DR = new DirectRequest();
	DR.Send(curActionPage,s,DirectResponseMessage)
	obj.style.visibility = "hidden"
	GetID('ConnectingImg').style.display = ""
	GetID('SendButton').style.visibility = "hidden"
}

function DirectResponseMessage(isError,msg) {
	GetID('ConnectingImg').style.display = "none"
	GetID('SendButton').style.visibility = ""
	if (isError) { alert("Ошибка отправки: " + msg); return}
	var n = msg.indexOf("="); if (n==-1) return
	cmd = msg.substr(0,n)
	param = msg.substr(n+1)
	switch (cmd) {
		case "ok": break;
		case "go": location = param; break;
		case "error": alert("Ошибка отправки: " + param); return;
	}
	GetID('FormSendMessage').style.display = "none"
	RestoreOldDisplay();
}


this.Close = function() {
	if (GetID('FormText').value!="") {if (!confirm("Вы уверены что хотите отменить ввод сообщения?")) return};
	RestoreOldDisplay()
}
function RestoreOldDisplay() {
	if (OldObj != null) {OldObj.style.display = "none"; OldObj.innerHTML="";}
	if (OldObjButton != null) OldObjButton.style.display = ""
}




//////////////////////////////////////////////////

this.InsertQuote = function() {
	var t = GetSelectionText();
	if (t=="") {alert("Для вставки цитаты нужно сначала выделить цитируемый текст");return;}
	getTextAreaSelection("FormText").setSelectedText("[quote]","[/quote]",t)
}
this.InsertVoite = function() {
	getTextAreaSelection("FormText").setSelectedText("[voite=","]\r\n")
}
this.InsertSmile = function(n) {
	getTextAreaSelection("FormText").setSelectedText(" [sm" + n + "] ","")
}
this.InsertSimple = function(tag) {
	if (getTextAreaSelection("FormText").getSelectedText() =="") {alert("Сначала выделите текст в своем сообщении"); return}
	getTextAreaSelection("FormText").setSelectedText("[" + tag + "]","[/" + tag + "]")
}

//---------------
var ParametrsHtml1 = "<input type='text' id='ParametrsUrl' onkeydown='return FormAnswer.onKeyUpParametrsUrl(event)' size='40' maxlength='200' style='width: 300;'>"
var ParametrsHtml2 = "&nbsp;<input id='InsertUrlSpanOk' type='button' value=' ok ' onmouseup='FormAnswer.ParametrsOK()'>";
var ParametrsHtml3 = "&nbsp;<input id='InsertUrlSpanCancel' type='button' value='отмена' onmouseup='FormAnswer.ParametrsHide()'>";

var ParametrsMode=0
this.ParametrsShow = function(title,tags,Mode) {
	ParametrsMode = Mode
	s=title
	s=s+"&nbsp;&nbsp;" + tags;
	s=s+"<br><br>"
	GetID('ParametrsSpan').innerHTML=s;
	obj = GetID('ParametrsUrl')
	obj.value="";
	SetCursorToEnd(obj)
}
this.ParametrsHide = function() {
	GetID('ParametrsSpan').innerHTML="";
}

this.onKeyUpParametrsUrl = function(e) {
	var keynum=0;
	if (window.event) {keynum = e.keyCode;} else if(e.which){keynum = e.which;}
	if (keynum==13) {this.ParametrsOK(); return false;}
	return true;
}


this.InsertImg = function() {
	this.ParametrsShow("введите адрес картинки",ParametrsHtml1 + ParametrsHtml2 + ParametrsHtml3 + " <a target='_blank'><input type='button' value='закачать' onmouseup='window.open(\"http://radikal.ru\")'></a>",1)
}
this.InsertMp3 = function() {
	this.ParametrsShow("введите адрес Mp3 файла",ParametrsHtml1 + ParametrsHtml2 + ParametrsHtml3  + " <a target='_blank'><input type='button' value='закачать' onmouseup='alert(\"Имя файла должно состоять ТОЛЬКО из латинскими букв, иначе файл не будет воспроизводится!\"); window.open(\"http://mpfiles.ru//\")'></a>",2)
}

this.InsertURL = function() {
	if (getTextAreaSelection("FormText").getSelectedText() =="") {alert("Сначала выделите текст ссылки в своем сообщении"); return}
	this.ParametrsShow("введите адрес ссылки",ParametrsHtml1 + ParametrsHtml2 + ParametrsHtml3,3)
}

this.ParametrsOK = function() {
	var obj = GetID('ParametrsUrl')
	if (!CheckURL(obj.value)) return
	switch(ParametrsMode) {
		case 1: {getTextAreaSelection("FormText").setSelectedText("[img src=" + obj.value + "]",""); break}
		case 2: {getTextAreaSelection("FormText").setSelectedText("[mp3 src=" + obj.value + "]",""); break}
		case 3: {getTextAreaSelection("FormText").setSelectedText("[url=" + obj.value + "]","[/url]"); break}
	}
	this.ParametrsHide()
}


function SetCursorToEnd(obj) {
	obj.focus()
	if (document.selection) {
    	range = obj.createTextRange();
	    var m = range.moveStart("textedit");
    	range.select();
	}
}




function CheckURL(url) {
	if (url.length<(7+3) || (url.substring(0, 7)!="http://" && url.substring(0, 8)!="https://") ) {alert("Адрес должен начинаться на http(s):// и не должен быть пустым!"); return false;}
	return true
}


this.CheckSymbolCount = function(obj1) { 
	if (obj1.value.length >= SymbolCountMax) obj1.value = obj1.value.substring(0,SymbolCountMax);
	GetID("SymbolCounter").innerHTML=(SymbolCountMax-obj1.value.length);
	obj1.focus();
}


this.ConfirmIgnoreListAddOperation = function (UserMame,nOp) {
	return confirm("Вы уверены что хотите " + (nOp==0?"за":"раз") + "блокировать данного Жителя " + UserMame + "? Он " + (nOp==0?"НЕ СМОЖЕТ Вам больше писать личных сообщений":"СМОЖЕТ Вам теперь писать личные сообщения") )
}



//---------------------------
var keysArray = new Array (1105,49,50,51,52,53,54,55,56,57,48,45,61,0,  1081,1094,1091,1082,1077,1085,1075,1096,1097,1079,1093,1098,0,  -1,1092,1099,1074,1072,1087,1088,1086,1083,1076,1078,1101,92,0,  1103,1095,1089,1084,1080,1090,1100,1073,1102,46,-3,-2);

this.RusKeyboardShow = function() {
	var s1 = "";
	for (var i=0;i<keysArray.length;i++) {
		var k = String.fromCharCode(keysArray[i])
		switch (keysArray[i]) {
			case 0: {s1 = s1 + "<br>"; break;}
			case -1: {s1 = s1 + "<input type='button' class='box5' onclick='FormAnswer.RusKeyboardCapsClick()' value='CAPS'>\n "; break;}
			case -2: {s1 = s1 + "<input type='button' class='box5' onclick='FormAnswer.ParametrsHide()' value='закрыть'>\n "; break;}
			case -3: {s1 = s1 + "<input type='button' class='box5' onclick='FormAnswer.RusKeyboardClick(32)' value='         '>\n "; break;}
			default: {s1 = s1 + "<input id='keyBt" + i + "' type='button' class='box5' onclick='FormAnswer.RusKeyboardClick(" + keysArray[i] + ")' value=' " + k + " '>\n "; break;}
		}
	}
	GetID('ParametrsSpan').innerHTML = "" + s1 + "<br>"
	SetCursorToEnd(GetID("FormText"));
}

var isLowerCaseMode = true;
this.RusKeyboardCapsClick = function() {
	isLowerCaseMode = !isLowerCaseMode
	for (var i=0;i<keysArray.length;i++) {
		obj = GetID('keyBt' + i);
		if (obj != null) obj.value = isLowerCaseMode ? obj.value.toLowerCase() : obj.value.toUpperCase()
	}
}

this.RusKeyboardClick = function(btn) {
	var k = String.fromCharCode(btn);
	getTextAreaSelection("FormText").setSelectedText(isLowerCaseMode ? k.toLowerCase() : k.toUpperCase(),"");
}


}





function GetID(id) {return document.getElementById(id)}

function GetSelectionText() {
	if(document.selection) {
		var t = document.selection.createRange();
		return t.text;
	}
	else {
		return window.getSelection().toString();
	}
}



//========================================================
// Массив экземпляров объекта
var textAreaSelectionObjects = [];
// Получаем экземпляр объекта
function getTextAreaSelection(id) {
    if (typeof(textAreaSelectionObjects[id]) == "undefined") {
        textAreaSelectionObjects[id] = new textAreaSelectionHelper(id);
    }
    return textAreaSelectionObjects[id];
}
function delTextAreaSelection(id) {
   textAreaSelectionObjects[id] = undefined;
}
// Конструктор, принимает в качестве аргумента ID текстарии
function textAreaSelectionHelper(id) {
    var obj = document.getElementById(id);
    this.target = obj;
    // Создаем свойства carretHandler для доступа к объекту в контексте узла из обработчиков событий
    this.target.carretHandler = this;
    // Добавляем обработчик событий
    this.target.onchange = _textareaSaver;
    this.target.onclick = _textareaSaver;
    this.target.onkeyup = _textareaSaver;
    this.target.onfocus = _textareaSaver;
    if(document.attachEvent) this.target.onselect = _textareaSaver;
    // Свойства для запоминания позиции выделения
    this.start=-1;
    this.end=-1;
    this.scroll=-1;
    this.iesel=null;
}
// В прототип записываем методы
textAreaSelectionHelper.prototype = {
    // Получим выделение
    getSelectedText : function() {
        return this.iesel? this.iesel.text: (this.start>=0&&this.end>this.start)? this.target.value.substring(this.start,this.end): "";
    },
    // Установим текстовые фрагменты до выделения - text
    // и после него, если нужно - secondtag
    setSelectedText : function(tag1, tag2, selectedText) {
        if (this.iesel) {
            if (typeof(tag2) == "string") {
				var t1 = (typeof(selectedText) == "string") ? selectedText : this.iesel.text
                this.iesel.text = tag1 + t1 + tag2;
                this.iesel.moveEnd("character", -tag2.length);
                this.iesel.moveStart("character", -t1.length);   
            } else {
                this.iesel.text = tag1;
            }
            this.iesel.select();
        } else if (this.start >= 0 && this.end >= this.start) {
            var left = this.target.value.substring(0, this.start);
            var right = this.target.value.substr(this.end);
            var t2 = (typeof(selectedText) == "string") ? selectedText : this.target.value.substring(this.start, this.end);
            if (typeof(tag2) == "string") {
                this.target.value = left + tag1 + t2 + tag2 + right;
                this.end = this.target.selectionEnd = this.start + tag1.length + t2.length;
                this.start = this.target.selectionStart = this.start + tag1.length;    
            } else {
                this.target.value = left + tag1 + right;
                this.end = this.target.selectionEnd = this.start + tag1.length;
                this.start = this.target.selectionStart = this.start + tag1.length;
            }
            this.target.scrollTop = this.scroll;
            this.target.focus();
        } else {
            this.target.value += tag1 + ((typeof(tag2) == "string") ? tag2: "");
            if (this.scroll >= 0) this.target.scrollTop = this.scroll;
        }
    }
}
// Обработчик событий. Занимается сохранением информации о выделении и позиции скролла
function _textareaSaver() {
	FormAnswer.CheckSymbolCount(this.carretHandler.target)
    if(document.selection) {
        this.carretHandler.iesel = document.selection.createRange().duplicate();
    } else if(typeof(this.selectionStart) != "undefined") {
        this.carretHandler.start = this.selectionStart;
        this.carretHandler.end = this.selectionEnd;
        this.carretHandler.scroll = this.scrollTop;
    } else {
        this.carretHandler.start = this.carretHandler.end = -1;
    }
}


