
/* замена дополнительных бб-тегов на хтмл код: */
function newbbtag(data){
data=data.replace(/`/g, "");

/* 0. отключение всех тегов в сообщении */
if(data.split('\[nobbtags\]').length<2){


/* 1-4. выравнивание по сторонам */
data=data.replace(/\[right\]((?:[^\[]|\[(?!\/right\]))+)\[\/right\]/gi, "<p class=\"BBTagRight\" align=\"right\">$1<\/p>");
data=data.replace(/\[left\]((?:[^\[]|\[(?!\/left\]))+)\[\/left\]/gi, "<p class=\"BBTagLeft\" align=\"left\">$1<\/p>");
data=data.replace(/\[center\]((?:[^\[]|\[(?!\/center\]))+)\[\/center\]/gi, "<p class=\"BBTagCenter\" align=\"center\">$1<\/p>");
data=data.replace(/\[justify\]((?:[^\[]|\[(?!\/justify\]))+)\[\/justify\]/gi, "<p class=\"BBTagJustify\" align=\"justify\">$1<\/p>");

/* 5. почтовый адрес */
data=data.replace(/\[mail\]([0-9a-z_]+@[0-9a-z_^.]+.[a-z]{2,3})\[\/mail\]/gi, "<a class=\"BBTagMail\" href=mailto:$1><u>$1<\/u><\/a>");

/* 6. вставка флеш-ролика */
data=data.replace(/\[flash\]([-a-z0-9\_\/\.\:]+\.swf)\[\/flash\]/gi, "<object codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0\" class=\"BBTagFlash\"><param name=\"movie\" value=\"$1\"><param name=\"loop\" value=\"1\"><param name=\"quality\" value=\"high\"><param name=\"bgcolor\" value=\"#FFFFFF\"><param name=\"wmode\" value=\"transparent\"><embed src=\"$1\" loop=\"1\" quality=\"high\" wmode=\"transparent\" class=\"BBTagFlash\" type=\"application/x-shockwave-flash\" pluginspace=\"http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash\"></embed></object>");

/* 7. вставка аббревиатуры */
data=data.replace(/\[\/abbr\]/g, "`");
data=data.replace(/\[abbr title=([-a-z0-9а-я\s\.\,\_\!\?\@]+)\]([^`]+)`/gi, "<abbr class=\"BBTagAbbr\" title=\"$1\">$2<\/abbr>");
data=data.replace(/`/g, "");

/* 8. фоновое выделение текста */  
data=data.replace(/\[\/marker\]/g, "`");
data=data.replace(/\[marker\]([^`]+)`/g, "<span class=\"BBTagMarker\" style=\"background-color:#FFFF99\">$1<\/span>");
data=data.replace(/\[marker color=([a-zA-Z0-9# ]{1,20})\]([^`]+)`/g, "<span class=\"BBTagMarker\" style=\"background-color:$1\">$2<\/span>");
data=data.replace(/`/g, "");

/* 9. текстовое поле */
data=data.replace(/\[edit size=([1-9]{1}[0-9]{0,1})\]([-a-z0-9а-я \/\=\;\:\.\[\]\,\_\!\?]+)\[\/edit\]/gi, "<input class=\"BBTagEdit\" type=\"text\" size=\"$1\" value=\"$2\">");
data=data.replace(/\[edit\]([-a-z0-9а-я \/\=\;\:\.\[\]\,\_\!\?]+)\[\/edit\]/gi, "<input class=\"BBTagEdit\" type=\"text\" size=\"40\" value=\"$1\">");

/* 10. вставка произвольного заранее заданного в настройках форума текста или хтмл-кода */
if(data.split('\[push slot=').length>1){
reg=/\[push slot=(\d+)\]/ig;
arr=reg.exec(data);
if(arr[1]<=slots.length-1){
str=slots[arr[1]];
data=data.replace(reg, "<span class=\"BBTagPush\">"+str+"<\/span>");
}
}

/* 11. вставка комментария */
data=data.replace(/\[\/comment\]/g,"`");
data=data.replace(/\[comment\]([^`]+)`/gm, "<div class=\"BBTagComment\">$1</div>");
data=data.replace(/\[comment float=(right|left)\]([^`]+)`/gm, "<div class=\"BBTagComment\" style=\"float:$1;\"><small>$2</small></div>");

/* 12. текстовое окно */
if(data.split('\[textarea\]').length == data.split('\[\/textarea\]').length){
data=data.replace(/\[\/textarea\]/g,"`");
data=data.replace(/\[textarea\]([^`]+)`/ig, "<textarea name=\"BBTagTextarea\" class=\"BBTagTextarea\">$1<\/textarea>");
data=data.replace(/`/g, "");
}

/* 13. текст не для гостей */
data=data.replace(/\[\/hideguest\]/g, "`");
if(group>0){
data=data.replace(/\[hideguest\]([^`]+)`/g, "<table class=\"BBTagHideguest\"><tr><td>$1</td></tr></table>");
}else{
data=data.replace(/\[hideguest\]([^`]+)`/g, "<span style=\"border-bottom-style: dashed;border-bottom-width:1;\">Только зарегистрированные пользователи могут видеть этот текст</span><table class=\"BBTagHideguest\" style=\"display:none;\"><tr><td>$1</td></tr></table>");
}
data=data.replace(/`/g, "");

/* 14. ячейка таблицы */
data=data.replace(/\[\/td\]/gi, "`");
data=data.replace(/\[td colspan=([1-9]{1})\]([^`]+)`/g, "<td colspan=\"$1\" class=\"BBTagTd\">$2<\/td>");
data=data.replace(/\[td width=([1-9]{1}[0-9]{0,1}[0-9]{0,1}[px%]{0,2})\]([^`]+)`/g, "<td width=\"$1\" class=\"BBTagTd\">$2<\/td>");
data=data.replace(/\[td width=([1-9]{1}[0-9]{0,1}[0-9]{0,1}[px%]{0,2}) colspan=([1-9]{1})\]([^`]+)`/g, "<td width=\"$1\" colspan=\"$2\" class=\"BBTagTd\">$3<\/td>");
data=data.replace(/\[td colspan=([1-9]{1}) width=([1-9]{1}[0-9]{0,1}[0-9]{0,1}[px%]{0,2})\]([^`]+)`/g, "<td width=\"$2\" colspan=\"$1\" class=\"BBTagTd\">$3<\/td>");
data=data.replace(/\[td\]([^`]+)`/g, "<td class=\"BBTagTd\">$1<\/td>");
data=data.replace(/`/g, "");

/* 15. ряд таблицы */
data=data.replace(/\[\/tr\]/g, "`");
data=data.replace(/\[tr\]([^`]+)`/g, "<tr class=\"BBTagTr\">$1<\/tr>");
data=data.replace(/\[tr height=([1-9]{1}[0-9]{0,1}[0-9]{0,1}[px%]{0,2})\]([^`]+)`/g, "<tr height=\"$1\" class=\"BBTagTr\">$2<\/tr>");
data=data.replace(/`/g, "");

/* 16. таблица */
data=data.replace(/\[\/table\]/g, "`");
data=data.replace(/\[table\]([^`]+)`/g, "<table border=1 cellpadding=\"5\" cellspacing=\"0\" class=\"BBTagTable\">$1<\/table>");
data=data.replace(/\[table width=([1-9]{1}[0-9]{0,1}[0-9]{0,1}[px%]{0,2})\]([^`]+)`/g, "<table width=\"$1\" border=1 cellpadding=\"5\" cellspacing=\"0\" class=\"BBTagTable\">$2<\/table>");
data=data.replace(/`/g, "");

/* 17. защита копирайта */
data=data.replace(/\[\/copyright\]/g, "`");
data=data.replace(/\[copyright\]([^`]+)`/g, "<div class=\"BBTagCopyright\" onmouseup=\"alert('Данный текст защищен законом об авторских правах. Если вы хотите скопировать его обратитесь к администрации форума за разрешением. Спасибо за понимание.')\">$1</div>");
data=data.replace(/`/g, "");

/* 18. размер шрифта */
data=data.replace(/\[\/size\]/g, "`");
data=data.replace(/\[size=([1-9]{1}[0-9]{0,1}[pxt]{2})\]([^`]+)`/g, "<span style='font-size:$1' class=\"BBTagSize\">$2<\/span>");
data=data.replace(/`/g, "");

/* 19. оформление списка */
data=data.replace(/\[\/list\]/g, "`");
data=data.replace(/\[list=d\]([^`]+)`/g, "<ul style='list-style-type:disc' class=\"BBTagList\">$1<\/ul>");
data=data.replace(/\[list=c\]([^`]+)`/g, "<ul style='list-style-type:circle' class=\"BBTagList\">$1<\/ul>");
data=data.replace(/\[list=s\]([^`]+)`/g, "<ul style='list-style-type:square' class=\"BBTagList\">$1<\/ul>");
data=data.replace(/\[list=1\]([^`]+)`/g, "<ul style='list-style-type:decimal' class=\"BBTagList\">$1<\/ul>");
data=data.replace(/\[list=i\]([^`]+)`/g, "<ul style='list-style-type:lower-roman' class=\"BBTagList\">$1<\/ul>");
data=data.replace(/\[list=I\]([^`]+)`/g, "<ul style='list-style-type:upper-roman' class=\"BBTagList\">$1<\/ul>");
data=data.replace(/\[list=a\]([^`]+)`/g, "<ul style='list-style-type:lower-alpha' class=\"BBTagList\">$1<\/ul>");
data=data.replace(/\[list=A\]([^`]+)`/g, "<ul style='list-style-type:upper-alpha' class=\"BBTagList\">$1<\/ul>");
data=data.replace(/\[list=n\]([^`]+)`/g, "<ul style='list-style-type:none' class=\"BBTagList\">$1<\/ul>");
data=data.replace(/`/g, "");

/* 20. мз3-плеер */
data=data.replace(/\[mp3\]([-a-z0-9\_\/\.\:]+)\[\/mp3\]/gi, '<object type="application/x-shockwave-flash" data="http://katalogue.org/forum/player-mp3.swf?mp3=$1" width="200" height="20" class="BBTagMP3"/><param name="movie" value="http://katalogue.org/forum/player-mp3.swf?mp3=$1" /><param name="wmode" value="transparent"></object>');

/* 21. вставка mp3-плеера с заливкой файла на хостинг filehoster.ru */
data=data.replace(/\[mp3hosting\]http:\/\/www\.filehoster.ru\/files\/([a-z0-9]+)\[\/mp3hosting\]/gi, "<object width='350' height='50' class=\"BBTagMP3Hoster\"><param name='movie' value='http://www.filehoster.ru/player/'/><param name='wmode' value='transparent'/><param name='FlashVars' value='dataurl=$1'/><embed src='http://www.filehoster.ru/player/' class=\"BBTagMP3Hoster\" type='application/x-shockwave-flash' width='350' height='50' wmode='transparent' flashvars='dataurl=$1'/></object>");

/* 22. вставка ролика с rutube.ru */
data=data.replace(/\[rut\]http:\/\/rutube\.ru\/tracks\/[0-9]+\.html\?v=([a-zA-Z0-9\-_]+)\[\/rut\]/gi, '<OBJECT width="470" height="353" class=\"BBTagRuTube\"><PARAM name="movie" value="http://video.rutube.ru/$1"></PARAM><PARAM name="wmode" value="window"></PARAM><PARAM name="allowFullScreen" value="true"></PARAM><EMBED src="http://video.rutube.ru/$1" type="application/x-shockwave-flash" wmode="window" width="470" height="353" allowFullScreen="true" class=\"BBTagRuTube\"></EMBED></OBJECT>');

/* 23. таблица */
data=data.replace(/\[\/code\]/g,"`");
data=data.replace(/\[code\]([^`]+)`/g, "<br><table align=center border=0 width=90%><tr><td class=font2>&#160;<small><b>"+l[119]+":</b></small></td></tr><tr><td><TABLE align=center bgColor=\""+diz[6]+"\" border=0 cellPadding=6 cellSpacing=1 width=100%><TR bgColor=\""+diz[4]+"\"><TD vAlign=top class=font2>$1</TD></TR></TABLE></td></tr></table><br>");
data=data.replace(/`/g, "");

/* 24. FIELDSET & legend */
data=data.replace(/\[\/fieldset\]/g,"`");
data=data.replace(/\[fieldset\]([^`]+)`/g, "<fieldset>$1</fieldset>");
data=data.replace(/`/g, "");
data=data.replace(/\[\/legend\]/g,"`");
data=data.replace(/\[legend\]([^`]+)`/g, "<legend>$1</legend>");
data=data.replace(/`/g, "");

/* 25. вставка шахматной доски */


if(data.split('\[chess\]').length>1){

	//Сборка объекта-библиотеки
	var chessLibrary={br:{fen:'r'},wr:{fen:'R'},bn:{fen:'n'},wn:{fen:'N'},bb:{fen:'b'},wb:{fen:'B'},bq:{fen:'q'},wq:{fen:'Q'},bk:{fen:'k'},wk:{fen:'K'},bp:{fen:'p'},wp:{fen:'P'}};
	var chl=[];
	for(var j in chessLibrary) chl.push(j);
	for(j=0;j<chl.length;j++){
		chessLibrary[chl[j]].name=chl[j];
		chessLibrary[chl[j]].code=function(){return '<img height=26px width=26px src="http://katalogue.org/forum/imgchess/'+this.name+'.png">';};
		chessLibrary[chl[j]].formalCase=function(){return this.name.charAt(0)+this.name.charAt(1).toUpperCase();};
		chessLibrary[chessLibrary[chl[j]].fen]=chessLibrary[chl[j]];
	}
	//Объект-библиотека собран
	
		//Сборка объекта-доски
		var chessboard = [];
		for(var yi=0;yi<8;yi++) chessboard[yi]=[];
		chessboard.isInitialise=false;
		chessboard.fen=function(){
			var chesstr=[],ky;
			var xi,yi;
			for(yi=0;yi<8;yi++){
				ky=0;
				chesstr.unshift('');
				for(xi=0;xi<8;xi++){
					if(this[yi][xi]) chesstr[0]+=this[yi][xi].fen;
					else chesstr[0]+='1';
				}
				chesstr[0]=chesstr[0].replace(/[1]+/g,function(str){return String(str.length);});
			}
			return chesstr.join("/");
		};
		chessboard.descript=function(){
			var chesstr=[];
			var xi,yi;
			for(yi=0;yi<8;yi++) for(xi=0;xi<8;xi++) if(chessboard[yi][xi]){
				chesstr.push(this[yi][xi].formalCase()+['a','b','c','d','e','f','g','h'][xi]+String(yi+1));
			}
			return chesstr.join(", ");
		};
		chessboard.code=function(){
			var chess = '<table><tr><td>';
			chess += '<table bgcolor="#ffffff" style="border:solid #c0c0c0 1.0pt;" cellspacing=0 cellpadding=0><tr><td><img height=210px width=16px src="http://katalogue.org/forum/imgchess/numers.png"></td><td><img height=18px width=210px src="http://katalogue.org/forum/imgchess/liters.png"><table border=0 style="border:solid #c0c0c0 1.0pt;" cellspacing=0 cellpadding=0>';
			var xi,yi;
			for(yi=7;yi>-1;yi--){
				chess += '<tr height=26px>';
				for(xi=0;xi<8;xi++){
					chess += '<td background="http://katalogue.org/forum/imgchess/'+['white',,'black'][Math.pow(-1,xi+yi)+1]+'.png" width=26px>';
					if(this[yi][xi]) chess+=this[yi][xi].code();
					chess += '</td>';
				}
				chess += '</tr>';
			}
			chess += '</table><img height=18px width=210px src="http://katalogue.org/forum/imgchess/liters.png"></td><td><img height=210px width=16px src="http://katalogue.org/forum/imgchess/numers.png"></td></tr></table><p style="text-align: right; margin: 0px;"><small><b>';

			chess += '<a style="color:'+diz[7]+'" title="код для шахматных программ" href="javascript:pst3(\'\',\'\',\'\',\'\[chess\',\'\]'+this.fen()+'\[\/ch\'+\'ess\]\');">FEN-код</a> ';
			chess += '<a style="color:'+diz[7]+'" title="код для игры и цитирования на форуме" href="javascript:pst3(\'\',\'\',\'\',\'\[chess\',\'\]'+this.descript()+'\[\/ch\'+\'ess\]\');">Цитата</a> ';

			chess += '</b></small></p></td></tr></table><br>';
			return chess;
		};
		chessboard.clear=function(){for(var xi,yi=0;yi<8;yi++) for(xi=0;xi<8;xi++) this[yi][xi] = null; this.isInitialise=false;};
		chessboard.parseDescript=function(code){
			this.clear();
			var chessmen=code.match(/[wb][rnbqkp][a-h][1-8]/ig);
			var nxy,x,y;
			for(var j=0;j<chessmen.length;j++){
				nxy=chessmen[j].match(/([wb][rnbqkp])([a-h])([1-8])/i);
				y=nxy[3]-1;
				x={a:0,b:1,c:2,d:3,e:4,f:5,g:6,h:7}[nxy[2]];
				this[y][x]=chessLibrary[nxy[1].toLowerCase()];
			}
			this.isInitialise=true;
		};
		chessboard.parseFen=function(code){
			this.clear();
			var y=7,x=0,m;
			for(var j=0;j<code.length && y>-1;j++){
				m=code.charAt(j);
				if(m==' ')break;
				else if(m.search(/^[rnbqkp]$/i)!=-1) this[y][x++]=chessLibrary[m];
				else if(m.search(/^[1-7]$/i)!=-1)x+=Number(m);
				else if(m=="/"){x=0;y--;}
			}
			this.isInitialise=true;
		};
		chessboard.setStartPos=function(){this.parseFen('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR');};
		chessboard.runStep=function(code){
			if(!this.isInitialise)this.setStartPos();
			var chessstep=code.match(/[a-h][1-8]-[a-h][1-8]/gi);
			var xyxy,x1,y1,x2,y2;
			for(var j=0;j<chessstep.length;j++){
				xyxy=chessstep[j].match(/([a-h])([1-8])-([a-h])([1-8])/i);
				x1={a:0,b:1,c:2,d:3,e:4,f:5,g:6,h:7}[xyxy[1]];
				x2={a:0,b:1,c:2,d:3,e:4,f:5,g:6,h:7}[xyxy[3]];
				y1=xyxy[2]-1;
				y2=xyxy[4]-1;
				if(this[y1][x1]){
					this[y2][x2]=this[y1][x1];
					this[y1][x1]=null;
				}
			}
		}
		//Объект-доска собран

	reg=/\[chess\]([\-a-z0-8\/,;: ]+)\[\/chess\]/ig;
	data=data.replace(reg,function(sourse,str){
		var arrmultiboard=str.split(';'); //строки, представляющие описание досок
		var chess = '<span class="BBTagChess">'; //Возвращаемая строка кода
		var code;
		chessboard.clear();
		for(var jh=0;jh<arrmultiboard.length;jh++){
			code=arrmultiboard[jh].split(':'); //Разделяем код от команд
			//проверяем в каком формате записан код - наличие слеша => фен-код
			//нашичие тире => командный код
			if(code[0]=="start") chessboard.setStartPos();
			else if(code[0].split('/').length>1) chessboard.parseFen(code[0]); //парсим фен-код
			else if(code[0].split('-').length>1) chessboard.runStep(code[0]);
			else chessboard.parseDescript(code[0]); //парсим описательный код
			if(code.length>1) if(code[1].split('-').length>1) chessboard.runStep(code[1]);
			chess+=chessboard.code(); //Собираем код таблицы на основании массива
			//Код составлен
		}
		return chess+'</span>';
	});
}







}


return data;
}
