function fmEditing(nmDiv, nmClass, bmName)
 {
   this.nameDiv = nmDiv;
   this.nmClass = nmClass;
   this.nmSubmit = bmName;
 	
   this.codeHTML   = 0;
   this.codeSmiles = 0;
   
   this.formElse = 0;
   this.TextArea_Txt = '';
   
   this.bmPreview  = 0;
   
   this.bmTextEdit = 1;
   this.bmTextStyle= 0;
   this.bmImgAdd   = 0;
   this.bmLinkAdd  = 0;
   this.bmModules  = 0;
   
   this.bmSmiles  = 0;
   
   this.admCode = 0;
   
   this.cssAddBreak = [0,0,0,0,0,0];
   this.cssBR = 45;
   
   var ua = navigator.userAgent.toLowerCase();
   var isIE = (ua.indexOf("msie") != -1 && ua.indexOf("opera") == -1 && ua.indexOf("webtv") == -1); 
   this.browIE = isIE;
   
   this.vArrSm = ['biggrin.gif', 'bounce.gif', 'cranky.gif', 'confused.gif', 'wink.gif', 'embarrassment.gif', 
                'hurray.gif', 'king.gif', 'wallbash.gif', 'beer.gif', 'applause.gif', 'up.gif', 'aq.gif', 
                'lol.gif', 'love.gif', 'bad.gif'];
   this.vArrSbl = [':)', '^_^', '|)', 'o_0', ';)', ':-[', ':_:', '^^', '-|', 'c|_|', '!!!', '-_^', '--=', ')))', ':-}', ':_('];

 }
 
 fmEditing.prototype.showForm = function()
 {
   document.getElementById(this.nameDiv).innerHTML = 'Подождите, идет загрузка формы...';
   
   var str = '<table class="tbEdit" border="0" cellpadding="5" cellspacing="5" width="100%">';
   
   if(this.formElse){
   	 str += '<tr><th>' + this.formElse + '</th></tr>';
   }

   str += '<tr><th>' + this.panelForming() + '</th></tr>';
   
   str += this.fmTextArea();
   
   str += this.fmButtoms();
   
   str += '</table>';
   
   document.getElementById(this.nameDiv).innerHTML = str;
   
   return true;
 }
 
 fmEditing.prototype.panelForming = function()
 {
 	var str = '';
 	  
 	if(this.bmTextStyle)
 	  str += this.fmTextStyle(0);
 	  
 	if(this.bmTextEdit)
 	  str += this.fmTextEdit(1);  
 	  
 	if(this.bmImgAdd)
 	  str += this.fmImgAd(2);
 	  
 	if(this.bmLinkAdd)
 	  str += this.fmLinkAdd(3);
 	  
 	if(this.bmModules)
 	  str += this.fmModules(4);
 	  
 	return str;
 }
 
 fmEditing.prototype.cssBreaking = function(num)
 {
 	return (this.cssAddBreak[num] ? '<font style="font-size:'+this.cssBR+'px;"><br></font>' : '');
 }
 
 fmEditing.prototype.fmTextEdit = function(num)
 {
 	var str = (this.browIE ? '<font style="font-size:65px;"><br></font>': '') + this.cssBreaking(num) + '<table border="1" align="left"><tr>';
 	            
 	var bm = ['b', 'i', 'u', 's', 'sup', 'sub', 'dd', 'center']; 
 	var bm_title = ['жирный шрифт', 'курсив', 'подчеркивание', 'зачеркнуто', 'нижний регистр', 'верхний регистр', 'отступ в начале текста', 'центрирование'];
 	var bm_desc = ['<b>B</b>', '<i>I</b>', '<b style="border-bottom:1px solid #C2957B;">U</b>', '<s>W</s>','T<sup>2</sup>', 'T<sub>2</sub>', 'FL',
 	               '<center>C</center>'];    
 	for(var k = 0; k < bm.length; k++)   
 	  str += '<td <td onmousemove="'+this.nmClass+'.fmChOver(this, \''+ bm_title[k] +'\')" onmouseout="'+
 	         this.nmClass+'.fmChOut(this)" onmousedown="'+this.nmClass+
 	         '.fmOn(\''+bm[k]+'\')" class="bmStyle" id="bm_i_'+bm[k]+'" name="bm_'+bm[k]+'">'+bm_desc[k]+'</td>';
 
 	str +=      '<tr></table>';
 	return str;
 }
 
 fmEditing.prototype.fmTextStyle = function(num)
 {
  	var str = /*this.cssBreaking(num) + */ '<table border="1" align="left"><tr>';
 	            
 	var bm = ['h', 'font-size', 'font-family', 'background-color', 'color']; 
 	var bm_title = ['Тип текста (раздел / подраздел)', 'Размер шрифта', 'Тип шрифта', 'Цвет фона', 'Цвет шрифта'];
 	
 	var bm_i_h = ' <select name="bm_H" style="width:45px;_width:140px;overflow:hidden;" onchange="'+this.nmClass+
 	             '.fmOn(\'h\'+this.options[this.selectedIndex].value)">'+
 	             '<option value="1">(h1) - Заглавие</option>  <option value="2">(h2) - Раздел</option>'+
 	             '<option value="3">(h3) - Подраздел</option> <option value="4">(h4) - Категория</option>'+
 	             '<option value="5">(h5) - Подкатегория</option>' +
 	             '</select>';
 	var bm_i_fz = ' <select name="bm_font-size" style="width:45px;height:20px;overflow:hidden;" onchange="'+this.nmClass+
 	             '.fmOn(\'font-size:\'+this.options[this.selectedIndex].value)">'+
 	             '<option value="8" style="font-size:8pt;">8pt</option>  <option value="10" style="font-size:10pt;">10pt</option>'+
 	             '<option value="12" style="font-size:12pt;">12pt</option> <option value="14"  style="font-size:14pt;">14pt</option>'+
 	             '<option value="16" style="font-size:16pt;">16pt</option> <option value="18" style="font-size:18pt;">18pt</option>'+
 	             '<option value="24" style="font-size:24pt;">24pt</option>' +
 	             '</select>';  
 	var bm_i_ff= ' <select name="bm_font-family" style="width:65px;_width:160px;overflow:hidden;" onchange="'+this.nmClass+
 	             '.fmOn(\'font-family:\'+this.options[this.selectedIndex].value)">'+
 	             '<option value="serif" style="font-family:serif;">шрифты с засечками</option>'+
 	             '<option value="sans-serif" style="font-family:sans-serif;">рубленные шрифты</option>'+
 	             '<option value="cursive"  style="font-family:cursive;">курсивные шрифты</option>'+
 	             '<option value="fantasy" style="font-family:fantasy;">декоративные шрифты</option>'+
 	             '<option value="monospace" style="font-family:monospace;">моноширинные шрифты</option>' +
 	             '</select>';  
 	var bm_i_bc= '<select name="bm_background-color" style="height:20px;width:19px;_width:160px;overflow:hidden;border:10px solid orange;" onchange="'+this.nmClass+
 	             '.fmOn(\'background-color:\'+this.options[this.selectedIndex].value)">'+
 	             '<option disabled>Цвет фона</option>'+
 	             '<option value="red" style="background-color:red;">красный</option>'+
 	             '<option value="orange" style="background-color:orange">оранжевый</option>'+
 	             '<option value="yellow"  style="background-color:yellow">желтый</option>'+
 	             '<option value="green" style="background-color:green">зеленый</option>'+
 	             '<option value="blue" style="background-color:blue;color:white;">синий</option>' +
 	             '<option value="silver" style="background-color:silver">серебристый</option>' +
 	             '<option value="white" style="background-color:white;">белый</option>' +
 	             '<option value="black" style="background-color:black;color:white;">черный</option>' +
 	             '</select>';  
 	var bm_i_c=  ' <select name="bm_color" style="height:20px;width:19px;_width:160px;overflow:hidden;border:10px solid green;" onchange="'+this.nmClass+
 	             '.fmOn(\'color:\'+this.options[this.selectedIndex].value)">'+
 	             '<option disabled>Цвет шрифта</option>'+
 	             '<option value="red" style="background-color:silver;color:red;">красный</option>'+
 	             '<option value="orange" style="background-color:silver;color:orange">оранжевый</option>'+
 	             '<option value="yellow"  style="background-color:silver;color:yellow">желтый</option>'+
 	             '<option value="green" style="background-color:silver;color:green">зеленый</option>'+
 	             '<option value="blue" style="background-color:silver;color:blue;">синий</option>' +
 	             '<option value="white" style="background-color:silver;color:white">белый</option>' +
 	             '<option value="black" style="background-color:silver;color:black;">черный</option>' +
 	             '<option value="silver" style="background-color:black;color:silver">серебристый</option>' +
 	             '</select>';                                                 
 	var bm_desc = [bm_i_h, bm_i_fz, bm_i_ff, bm_i_bc, bm_i_c];    
 	
    for(var k = 0; k < bm.length; k++)   
 	  str += (this.browIE & (k == 1 || k == 3) & this.cssAddBreak[num] ? '</tr><tr>' : '')+
 	         '<td onmousemove="'+this.nmClass+'.fmChOver(this, \''+ bm_title[k] +'\')" onmouseout="'+
 	         this.nmClass+'.fmChOut(this)" class="bmStyle" id="bm_i_'+bm[k]+'" name="bm_'+bm[k]+'"'+
 	         (this.browIE ?' style="text-align:right !important;"' : '') + '>'+bm_desc[k]+'</td>';
 
 	str +=      '<tr></table>';
 	return str;	
 }
 
 fmEditing.prototype.fmImgAd = function(num)
 {
 	var str = this.cssBreaking(num) +'<table border="1" align="left"><tr>';
 	            
 	var bm = ['img']; 
 	var bm_title = ['Вставка изображения'];
 	var bm_desc = ['<img src="http://citadel-liga.info/img/mn/sw.gif" width="20px" height="20px">'];    
 	var k = 0;   
 	str += '<td <td onmousemove="'+this.nmClass+'.fmChOver(this, \''+ bm_title[k] +'\')" onmouseout="'+
 	        this.nmClass+'.fmChOut(this)" onmousedown="'+this.nmClass+
 	        '.fmOn(\''+bm[k]+':::\')" class="bmStyle" id="bm_i_'+bm[k]+'" name="bm_'+bm[k]+'">'+bm_desc[k]+'</td>';
 
 	str +=  '<tr></table>';
 	return str; 	
 }
 
 fmEditing.prototype.fmLinkAdd = function(num)
 {
 	var str = this.cssBreaking(num) +'<table border="1" align="left"><tr>';
 	            
 	var bm = ['a']; 
 	var bm_title = ['Вставка ссылки'];
 	var bm_desc = ['L'];    
 	var k = 0;   
 	str += '<td <td onmousemove="'+this.nmClass+'.fmChOver(this, \''+ bm_title[k] +'\')" onmouseout="'+
 	        this.nmClass+'.fmChOut(this)" onmousedown="'+this.nmClass+
 	        '.fmOn(\''+bm[k]+'::\')" class="bmStyle" id="bm_i_'+bm[k]+
 	        '" name="bm_'+bm[k]+'">'+bm_desc[k]+'</td>';
 
 	str +=  '<tr></table>';
 	return str; 	 	
 }
 
 fmEditing.prototype.fmModules = function(num)
 {
 	var str = this.cssBreaking(num) +'<table border="1" align="left"><tr>';
 	            
 	var bm = ['module']; 
 	var bm_title = ['Добавление к статье модуля'];
 	var bm_desc = [' <select name="bm_color" style="height:20px;width:160px;overflow:hidden;" onchange="'+this.nmClass+
 	             '.fmOnAdd(this.options[this.selectedIndex].value, 1)">'+
 	             '<option disabled>Выбор модуля</option>'+
 	             '<option value="ViO">справочник</option>'+
 	             '</select>'];    
 	var k = 0;   
 	str += '<td <td onmousemove="'+this.nmClass+'.fmChOver(this, \''+ bm_title[k] +'\')" onmouseout="'+
 	        this.nmClass+'.fmChOut(this)" class="bmStyle2" id="bm_i_'+bm[k]+'" name="bm_'+bm[k]+'">'+bm_desc[k]+'</td>';
 
 	str +=  '<tr></table>';
 	return str; 	 	
 }

/* ------------------------------------------------ */ 
 fmEditing.prototype.fmTextArea = function()
 {
 	var width = (document.getElementById(this.nameDiv).style.width);
 	return '<tr><td><textarea id="txtEditText" name="text" rows="20" style="width:'+(width)+'">'+this.TextArea_Txt+'</textarea></td></tr>';
 }
/* ------------------------------------------------ */ 
 fmEditing.prototype.fmButtoms = function()
 {
 	return '<tr><td>'+
 	       (this.admCode ? '<img src="http://citadel-liga.info/fonts/shifr.php" border="1" align="absmiddle"> '+
 	        ' <input type="text" name="cotrl" size=8 class="texta" maxlength="6"/> ' : '') +
 	        
 	       '<input type="submit" value="'+this.nmSubmit+'"  class="bmStyle2" onmousemove="'+
 	       this.nmClass+'.fmChOver(this, \''+ this.nmSubmit +'\')" onmouseout="'+
 	       this.nmClass+'.fmChOut(this)">'+
 	       (this.bmPreview ? ' <input type="button" id="bmReview" onclick="'+this.nmClass+
 	        '.fmLookPreview();" value="Предпросмотр"  class="bmStyle2">' : '') +
           (this.bmSmiles ? ' <input type="button" id="bmReview" onclick="'+this.nmClass+
 	        '.fmLookSmiles();" value="=)" title="Смайлы" alt="Смайлы" class="bmStyle">' : '') +	        
 	        (this.bmPreview ? '</td></tr><tr><td id="fmEditing_Preview">' : '')+
 	       
 	       '</td></tr>';
 	       
 	           
 }
 
 fmEditing.prototype.fmLookSmiles = function()
 {
   	document.getElementById('fmEditing_Preview').innerHTML = '';
   	document.getElementById('bmReview').value = 'Скрыть';
    var Text = '';
    for(var i = 0; i < this.vArrSm.length; i++)
      Text += '<div align="left" class="bmStyle3"  onmousemove="'+this.nmClass+'.fmChOver(this, \''+ 
               this.vArrSbl[i] +'\')" onmouseout="'+ this.nmClass+
               '.fmChOut(this)" id="bm_smile_'+i+'"><img src="http://citadel-liga.info/forum/img/smiles/' + 
               this.vArrSm[i] +'" height="20px" onclick="'+this.nmClass+'.fmOnAdd(\'' + this.vArrSbl[i] + '\', 0)"></div>';
    
    document.getElementById('fmEditing_Preview').innerHTML = Text;
 } 
 
 fmEditing.prototype.fmLookPreview = function()
 {
    if(document.getElementById('fmEditing_Preview').innerHTML == ''){
      document.getElementById('bmReview').value = 'Скрыть';
      	
 	  var Text = document.getElementById('txtEditText').value;
 	  Text = this.fmConvertSmiles(Text); 
 	  var arrText = (this.codeHTML ? Text : this.fmConvertBB(Text)).split("\n");
 	  Text = '';
      for(var i = 0; i < arrText.length; i++)
        Text += arrText[i] + '<br>';
       
 	  document.getElementById('fmEditing_Preview').innerHTML = Text;
    }else{
      document.getElementById('fmEditing_Preview').innerHTML = '';
      document.getElementById('bmReview').value = 'Предпросмотр';
    }
 }

 fmEditing.prototype.fmConvertSmiles = function(str)
 {
   str = str.replace(/\:\)/g, '<img src="http://citadel-liga.info/forum/img/smiles/' + this.vArrSm[0] + '" height="15px">');	   str = str.replace(/\^\_\^/g, '<img src="http://citadel-liga.info/forum/img/smiles/' + this.vArrSm[1] + '" height="15px">');
   str = str.replace(/\|\)/g, '<img src="http://citadel-liga.info/forum/img/smiles/' + this.vArrSm[2] + '" height="15px">');
   
   str = str.replace(/\;\)/g, '<img src="http://citadel-liga.info/forum/img/smiles/' + this.vArrSm[4] + '" height="15px">');
   
   str = str.replace(/\:\-\[/g, '<img src="http://citadel-liga.info/forum/img/smiles/' + this.vArrSm[5] + '" height="15px">');
   str = str.replace(/\:\_\:/g, '<img src="http://citadel-liga.info/forum/img/smiles/' + this.vArrSm[6] + '" height="15px">');
   str = str.replace(/\^\^/g, '<img src="http://citadel-liga.info/forum/img/smiles/' + this.vArrSm[7] + '" height="15px">');
   str = str.replace(/\-\|/g, '<img src="http://citadel-liga.info/forum/img/smiles/' + this.vArrSm[8] + '" height="15px">');
  
   str = str.replace(/\!\!\!/g, '<img src="http://citadel-liga.info/forum/img/smiles/' + this.vArrSm[10] + '" height="15px">');
   str = str.replace(/\-\_\^/g, '<img src="http://citadel-liga.info/forum/img/smiles/' + this.vArrSm[11] + '" height="15px">');
   str = str.replace(/\-\-\=/g, '<img src="http://citadel-liga.info/forum/img/smiles/' + this.vArrSm[12] + '" height="15px">');
   str = str.replace(/\)\)\)/g, '<img src="http://citadel-liga.info/forum/img/smiles/' + this.vArrSm[13] + '" height="15px">');
   str = str.replace(/\:\-\}/g, '<img src="http://citadel-liga.info/forum/img/smiles/' + this.vArrSm[14] + '" height="15px">');
   str = str.replace(/\:\_\(/g, '<img src="http://citadel-liga.info/forum/img/smiles/' + this.vArrSm[15] + '" height="15px">');
 	                
   return str;
 }
 
 fmEditing.prototype.fmConvertBB = function(str)
 {
    // img 
 	str = str.replace(/\[\i\m\g\]/g, '<img src="');
 	str = str.replace(/\[\/\i\m\g\]/g, '"/>');
 	// простые теги
 	str = str.replace(/\[/g, '<');
 	str = str.replace(/\]/g, '>');
 	return str;
 }
 
/* ------------------------------------------------ */ 
  fmEditing.prototype.fmChOver = function(id, text)
 {
 	id.alt = text;
 	id.title = text;
 	id.style.backgroundColor = '#403E2E';
 	
 }

 fmEditing.prototype.fmChOut = function(id)
 {
 	id.style.backgroundColor = '#000000';
 }
 
 fmEditing.prototype.fmOn = function(tagName)
 {
 	this.fmChagneText(document.getElementById('txtEditText'), tagName);
 }
 
  fmEditing.prototype.fmOnAdd = function(tagName, vConv)
 {
   if(vConv)
     document.getElementById('txtEditText').value += this.fmTags(tagName, 'module');
   else
     document.getElementById('txtEditText').value += tagName;
     
   return true;
 }
 
 fmEditing.prototype.fmChagneText = function(obj,tagName)
 {
   obj.focus();
 
   if (document.selection){
     var s = document.selection.createRange(); 
     if (s.text)
     {
       s.text = this.fmTags(s.text, tagName);
       s.select();
       return true;
     }
   }else if (typeof(obj.selectionStart)=="number"){
     if (obj.selectionStart!=obj.selectionEnd){
       var start = obj.selectionStart;
       var end = obj.selectionEnd;

       var rs = this.fmTags(obj.value.substr(start,end-start), tagName);
       obj.value = obj.value.substr(0,start)+rs+obj.value.substr(end);
       obj.setSelectionRange(end,end);
     }
     return true;
   }
   return false;
 }
 
 fmEditing.prototype.fmTags = function(str, tagName)
 {
 	var tgB = this.codeHTML ? '<' : '[';
 	var tgE = this.codeHTML ? '>' : ']';
 	if(this.matchPTags(str)){
 	  if(tagName.indexOf(':') > 0){
 	  	if(tagName.indexOf('::') > 0){
 	  	  if(tagName.indexOf(':::') > 0)
 	  	    return tgB+tagName.substr(0, tagName.indexOf(':::'))+' src="'+str+'"/'+tgE;
 	  	  else
 	  	    return tgB+tagName.substr(0, tagName.indexOf('::'))+' href="'+str+'"'+tgE + str + 
 	  	           tgB+'/'+tagName.substr(0, tagName.indexOf('::'))+tgE;
 	  	}else
 	  	  return tgB+'font style="'+tagName+' !important"'+tgE + str + tgB+'/font'+tgE;
 	  }else
 	    return tgB+tagName+tgE + str + tgB+'/'+tagName+tgE;
 	}else{
 	  alert('Внутри выделенной строки находится незакрытый тег!');
 	  return str;	
 	}
 	  
 }
 
 fmEditing.prototype.matchPTags = function(str)
 { 
 	str = ' ' + str + ' ';
    if(fm.codeHTML){
      ot = (str.split(/\<[a|i|b|s|p|t].*?\>/i)).length - 1;
      ct = (str.split(/\<\/[a|i|b|s|p|t].*?\>/i)).length + (str.split(/\<[a|i|b|s|p].*?\/\>/i)).length - 2;
    }else{
      ot = (str.split(/\[[a|i|b|s|p|t].*?\]/i)).length - 1;
      ct = (str.split(/\[\/[a|i|b|s|p|t].*?\]/i)).length - 1;
    }
    return ot==ct ? 1 : 0;
  }
/* ----------------------------------------------- */