// -------------------------------------------------------------------------------
// --- DEFINES
// -------------------------------------------------------------------------------
	var reRegExp_1 = RegExp("<td([^>]+)?>(.*)<\/td>","mig");
	var reRegExp_2 = RegExp("<td([^>]+)?>(.*)<\/td>","mi");
	var reRegExp_3 = RegExp(" colspan=([0-9]+)","mi");
// -------------------------------------------------------------------------------
// --- описание класса rButton
// -------------------------------------------------------------------------------
	function rButton(name, type, title){ // Команды RE
		this.name		= name;							// имя команды (имя картинки в директории ./img/re_NAME.gif)
		this.type		= type;							// режим в котором кнопка активна
		this.title	= title;						// подпись
		this.button = null							// собственно кнопки как объект
	}
// -------------------------------------------------------------------------------
// --- описание класса rPanel
// -------------------------------------------------------------------------------
	var orPanel=null;
	function rPanel(){ // Панель инструментов RE
		this.commands = Array( 
			new rButton('bold',rTypeRich,'Полужирный [ctrl + b]'),
			new rButton('italic',rTypeRich,'Курсив [ctrl + i]'),
			new rButton('underline',rTypeRich,'Подчеркнутый [ctrl + u]'),
			new rButton('spacer',rTypeNone),
			new rButton('inserttable',rTypeRich,'Вставить таблицу'),
			new rButton('mergecells',rTypeRich,'Объединить ячейки'),
			new rButton('deleterow',rTypeRich,'Удалить строку'),
			new rButton('insertrow',rTypeRich,'Втавить строку'),
			new rButton('spacer',rTypeNone),
			new rButton('insertimage',rTypeRich,'Свойства изображения'),
			new rButton('createlink',rTypeRich,'Вставить ссылку'),
			new rButton('spacer',rTypeNone),
			new rButton('autoformat',rTypeRich|rTypeText,'Автоформат HTML'),
			new rButton('html',rTypeRich|rTypeText,'Режим редактирования'),
			new rButton('break',rTypeNone),

			new rButton('strikethrough',rTypeRich,'Зачеркнутый'),
			new rButton('subscript',rTypeRich,'Подстрочный'),
			new rButton('superscript',rTypeRich,'Надстрочный'),
			new rButton('spacer',rTypeNone),
			new rButton('justifyleft',rTypeRich,'По левому краю'),
			new rButton('justifycenter',rTypeRich,'По центру'),
			new rButton('justifyright',rTypeRich,'По правому краю'),
			new rButton('justifyfull',rTypeRich,'По ширине'),
			new rButton('spacer',rTypeNone),
			new rButton('insertorderedlist',rTypeRich,'Нумерация'),
			new rButton('insertunorderedlist',rTypeRich,'Маркеры'),
			new rButton('spacer',rTypeNone),
			new rButton('links',rTypeRich,'Библиотека файлов'),
			new rButton('images',rTypeRich,'Библиотека картинок')
		);
		// свойство : Автоформат текста HTML
		this.autoformat = true;
		// метод : инициализация панели инструментов RE
		this.initialize = rPanel_initialize;
		// метод : нажатие кнопки на панели
		this.action = rPanel_action;
		// метод : обновить состояние кнопок на панеле
		this.update = rPanel_update;
		// создаем едиственную копию себя самого и инициализируем ее
		if(orPanel==null){
			orPanel = this;
			orPanel.initialize();
		}
	}
// -------------------------------------------------------------------------------
// --- методы класса rPanel
// -------------------------------------------------------------------------------
	function rPanel_initialize(){ // инициализация панели инструментов RE
		if(orPanel==this){ // только одна панель может существовать в системе
			var html = "<div class=panel>"; // вывод HTML кнопок с командами 
			for(var i=0; i<this.commands.length; i++){
				if(this.commands[i].name=='break'){
					html += '<br>';
				}else if(this.commands[i].name=='spacer'){
					html += '<img src="'+orPath.base+orPath.image+"re_"+this.commands[i].name+'.gif" width=5 height=16 border=0>';
				}else if(this.commands[i].name=='images'&&orImages==null){
				}else if(this.commands[i].name=='links'&&orLinks==null){
				}else{
					html += '<button id="rPanel_'+this.commands[i].name+'" ';
					html += ' onClick="orPanel.action('+i+');" ';
					html += ' onMouseOver="if(!this.disabled){ this.classNameReal = this.className; this.className = \'up\';}"';
					html += ' onMouseOut="if(!this.disabled){ this.className = this.classNameReal;}"';
					html += '	title="'+this.commands[i].title+'">';
					html += '<img src="'+orPath.base+orPath.image+"re_"+this.commands[i].name+'.gif" width=16 height=16 border=0>';
					html += '</button>';
				}
			}
			html += "</div>";
			document.write(html);
			for(var i=0; i<this.commands.length; i++){ // собираем созданные объекты
				if(document.all['rPanel_'+this.commands[i].name]){
					this.commands[i].button = document.all['rPanel_'+this.commands[i].name];	
				}
			}
			this.update();
		}
	}
// --- 
	function rPanel_action(command){ // нажатие кнопки на панеле инструментов RE
		if(orTextActive!=null){
			var sRange = null;
			var mode = orTextActive.type; // состояние активного поля редактирования
			orTextActive.editor.focus();
			if((this.commands[command].type & mode) != 0){
				if(mode == rTypeRich){	// если режим позволяет, то достаем, что выделено
					orTextActive.edocument.document.body.focus();
					sRange = orTextActive.edocument.document.selection.createRange();
				}
				switch(this.commands[command].name){ // нижний индекс
				// --- нижний индекс
					case 'subscript':
						if(sRange.queryCommandState('superscript')) sRange.execCommand('superscript');
						sRange.execCommand('subscript');
					break;
				// --- верхний индекс
					case 'superscript': 
						if(sRange.queryCommandState('subscript')) sRange.execCommand('subscript');
						sRange.execCommand('superscript');
					break;
				// --- ссылка
					case 'createlink':
						if(sRange!=null && sRange.length!=1){
							window.showModalDialog(orPath.base+"richedit.createlink.html",sRange,"dialogWidth:313px; dialogHeight:100px; resizable: no; help: no; status: no; scroll: no;");
						}
					break;
				// --- изображение
					case 'insertimage': 
						if(sRange!=null && sRange.length==1 && sRange.item(0).tagName.toUpperCase() == "IMG"){
							window.showModalDialog(orPath.base+"richedit.insertimage.html",sRange,"dialogWidth:313px; dialogHeight:126px; resizable: no; help: no; status: no; scroll: no;");
						}
					break;
				// --- вставка таблицы
					case 'inserttable':
						if(sRange!=null && sRange.htmlText!=undefined){
							window.showModalDialog(orPath.base+"richedit.inserttable.html",sRange,"dialogWidth:174px; dialogHeight:234px; resizable: no; help: no; status: no; scroll: no;");
						}
					break;
				// --- объединение ячеек 
					case 'mergecells':
						if(sRange.length==1) return;	
						var elmTR = sRange.parentElement();
						if(elmTR.tagName.toUpperCase()=="TR"){	// только colSpan
							var elmTABLE = rGetParent(elmTR,"TABLE"); // ищем родительский TABLE
							var elmsTRs = elmTABLE.rows;	// все строки в таблице
							html = '<table '+ ((elmTABLE.width>0)?'width='+elmTABLE.width:'') +'>';
							for(var i=0; i<elmsTRs.length;i++){	// пробегаем по строкам
								var value = ""; var colSpan = 0;
								var elmsTDs = elmsTRs[i].cells;	// все столбцы строки	
								html += '<tr>';
								for(var j=0; j<elmsTDs.length;j++){	// пробегаем по столбцам строки
									var oRange = sRange.duplicate();
									oRange.moveToElementText(elmsTDs[j]);
									if(sRange.inRange(oRange)){	// попали в выделенную область
										colSpan += elmsTDs[j].colSpan; 
										value += " "+elmsTDs[j].innerHTML;
									}else{	// не попали
										if(colSpan>0){
											html += "<td colSpan="+colSpan+">"+value+"</td>";
											colSpan = 0;
										}
										html += "<td colSpan="+elmsTDs[j].colSpan+">"+elmsTDs[j].innerHTML+"</td>";
									}
								}
								if(colSpan>0){
									html += "<td colSpan="+colSpan+">"+value+"</td>";
									colSpan = 0;
								}
								html += '</tr>';
							}
							html += "</table>";
							elmTABLE.outerHTML = html;
						}
					break;
				// --- удаление строки
					case 'deleterow': 
						if(sRange.length==1) return;	
						var elmTR = rGetParent(sRange.parentElement(),"TR");
						if(elmTR!=null){	// выделена одна строка
							var elmTABLE = rGetParent(elmTR,"TABLE"); // ищем родительский TABLE
							var elmsTRs = elmTABLE.rows;	// все строки в таблице
							var selNum = 0; // номер выделенной строки
							if(elmsTRs.length==1){	// если таблицы состоит из обной строки
								elmTABLE.outerHTML = "";
							}else{
								for(var i=0; i<elmsTRs.length;i++){	// пробегаем по строкам
									if(elmTR==elmsTRs[i]) selNum = i;						
								}
								elmTR = elmTABLE.deleteRow(selNum);	// удаляем строку по ее номеру
							}
						}
					break;
				// --- вставка строки
					case 'insertrow': 
						if(sRange.length==1) return;	
						var elmTR = rGetParent(sRange.parentElement(),"TR");
						if(elmTR!=null){	// выделена одна строка
							var elmTABLE = rGetParent(elmTR,"TABLE"); // ищем родительский TABLE
							var elmsTRs = elmTABLE.rows;	// все строки в таблице
							var numCols = 0;	// количество столбцов
							var selNum  = 0; // номер выделенной строки
							for(var i=0; i<elmsTRs.length;i++){	// пробегаем по строкам
								var curCols=0;
								for(var j=0; j<elmsTRs[i].cells.length;j++){
									curCols += elmsTRs[i].cells[j].colSpan;
								}
								numCols = Math.max(numCols,curCols);
								if(elmTR==elmsTRs[i]) selNum = i;						
							}
							elmTR = elmTABLE.insertRow(selNum+1);
							for(var i=0; i<numCols;i++){
								var elmTD = elmTR.insertCell();
								elmTD.innerHTML = "&nbsp;";
							}

						}
					break;
				// --- библиотека изображений
					case 'images': 
						if(orImages!=null&&wrImages==null){
							wrImages = window.open(orPath.base+'richedit.images.phtml?d='+orImages.upload+'&h='+orImages.height+'&w='+orImages.width, "blankImage", "status=no,scrollbars=no,resizable=1,width=400,height=300");
						}else if(wrImages!=null){
							wrImages.close();
							wrImages=null;
						}
					break;
				// --- библиотека файлов
					case 'links': 
						if(orLinks!=null&&wrLinks==null){
							wrLinks = window.open(orPath.base+'richedit.links.phtml?d='+orLinks.upload, "blankLinks", "status=no,scrollbars=no,resizable=1,width=400,height=100");
						}else if(wrLinks!=null){
							wrLinks.close();
							wrLinks=null;
						}		
					break;
				// --- автоформат html
					case 'autoformat':
						this.autoformat =	!this.autoformat;
					break;
				// --- переключение режимов
					case 'html':
						orTextActive.tswitch((mode==rTypeText)?rTypeRich:rTypeText);
					break;
				// --- стандартные команды
					default:
						if(sRange && sRange!=null && sRange.queryCommandEnabled(this.commands[command].name))
							sRange.execCommand(this.commands[command].name);
					break;
				}
			}	
			orTextActive.synchro();	
		}
	}
// --- 
	function rPanel_update(){ // обновить состояние кнопок на панеле инструментов RE
		var mode = (orTextActive!=null)?orTextActive.type:rTypeNone; // состояние активного поля редактирования
		// Обновляем состояния кнопок с командами
		for(var i=0; i<this.commands.length; i++){
			if(this.commands[i].button!=null){
				if((this.commands[i].type & mode) == 0){
					this.commands[i].button.disabled = true;
					this.commands[i].button.classNameReal = 'lock';
				}else{
					this.commands[i].button.disabled = false;
					if(this.commands[i].name=="html") // --- переключение режимов
						this.commands[i].button.classNameReal = (mode==rTypeText)?"down":"";
					else if(this.commands[i].name=="autoformat") // --- автоформат
						this.commands[i].button.classNameReal = (this.autoformat)?"down":"";
					else
						this.commands[i].button.classNameReal = "";
				}
				this.commands[i].button.className = this.commands[i].button.classNameReal;
			}
		}
	}

