//id of active editor
var active_rich = null;

//prevent error messaging
window.onerror = no_error;

//parses toolbar button press event
function do_action(action,value){
var mode;
var sel;
var r;
var is_control;
var found;
var button_object;

  eval('mode = '+active_rich.name+'_rich_mode;'); //current mode

  active_rich.focus(); //set focus on active editor

  //in source mode buttons do not work
//  if(!mode) return;

  //hide popup menu if exists
//  if(rich_popup) rich_popup.hide();

  button_object = get_button_object(action);
  if(!active_button(button_object)){ //button is inactive
    return;
  }

  //check if any control element is active, e.g. image or table
	var sel;
	var range;
	var container_type;

	//do try to prevent errors when the editor in source mode
	try{
		sel = active_rich.getSelection();
		range = sel.getRangeAt(0);

//  sel = active_rich.document.selection;
//  r = sel.createRange();

var i;
/*
	for(i in sel){
		alert(i+' => '+sel[i]);
	}
	for(i in range){
		alert(i+' => '+range[i]);
	}
*/

		container_type = range.startContainer.nodeType;
	}catch(error){
	}

	if (container_type == 1) is_control = true;
		else is_control = false;

//  if(sel.type == 'Control') is_control = true;
//    else is_control = false;

  found = true;
  switch(action){
    case 'Cut':                 //cut
    case 'Copy':                //copy
    case 'Paste':               //paste
    case 'Undo':                //undo previous action
    case 'Redo':                //redo last cancelled action
    case 'Unlink':
      break;
    case 'Bold':                //set/unset bold style
    case 'Italic':              //set/unset italic style
    case 'Underline':           //set/unset undeline style
    case 'Strikethrough':       //set/unset strikethrough style
    case 'SuperScript':         //set/unset superscript style
    case 'SubScript':           //set/unset subscript style
    case 'JustifyFull':         //justify full
    case 'InsertOrderedList':   //insert ordered list
    case 'InsertUnorderedList': //insert unordered list
    case 'Outdent':             //decrease indention
    case 'Indent':              //increase indention
    case 'InsertHorizontalRule'://insert horizontal line
    case 'RemoveFormat':        //remove text formatting
      if(is_control) found = false;
      break;
    case 'JustifyLeft':         //justify left
    case 'JustifyCenter':       //justify center
    case 'JustifyRight':        //justify right
      break;
    case 'FormatBlock':         //set paragraph style
    case 'FontName':            //set font
    case 'FontSize':            //set font size
      if(is_control || !value) found = false;
        else value = value[value.selectedIndex].value;
      break;
    case 'ClassName':           //set class
      set_class(value[value.selectedIndex].value);
	  found = false;
      break;
    case 'ForeColor':           //set foreground color
    case 'HiliteColor':         //set background color
      if(is_control){
        found = false;
        break;
      }
      if(!value) {
		pick_color(null, action, active_rich.document.queryCommandValue(action));
	  }
		if (value == '') value = 'rgb(0, 0, 1)';
      break;
    case 'InsertRow':           //insert row in table
      found = false;
      if(is_control) break;

		if (value != null) {
			insert_row(value);
			switch_borders(false); //redraw borders under current border mode
		} else {
			insert_to('insert_row');
		}
      break;
    case 'DeleteRow':           //delete row from table
      found = false;
      if(is_control) break;
      delete_row();
      break;
    case 'InsertColumn':        //insert column in table
      found = false;
      if(is_control) break;

		if (value != null) {
			insert_column(value);
			switch_borders(false); //redraw borders under current border mode
		} else {
			insert_to('insert_column');
		}
      break;
    case 'DeleteColumn':        //delete column from table
      found = false;
      if(is_control) break;
      delete_column();
      break;
    case 'PasteWord':           //paste text from MSWord
//      paste_word();
	  show_dialog('PasteWord');
      found = false;
      break;
    case 'SwitchBorders':       //show invisible table borders
      switch_borders(true);
      found = false;
      break;
    case 'InsertChar':          //insert a special character
      found = false;
      if(is_control) break;
      insert_char();
      break;
    case 'InsertCell':          //insert cell
      found = false;
      if(is_control) break;
      insert_cell();
      switch_borders(false); //redraw borders under current border mode
      break;
    case 'DeleteCell':          //delete cell
      found = false;
      if(is_control) break;
      delete_cell();
      break;
    case 'MergeCells':          //merge cells
      found = false;
      if(is_control) break;
      merge_cells();
      break;
    case 'SplitCell':           //split cell
      found = false;
      if(is_control) break;
      split_cell();
      switch_borders(false); //redraw borders under current border mode
      break;
    case 'FullScreen':          //switch on/off fullscreen mode
      full_screen(get_editor_name(button_object));
      found = false;
      break;
    case 'InsertSnippet':      //show snippet popup menu/insert a snippet
      if(value!=null) insert_snippet(value);
//        else show_snippet_menu();
      found = false;
      break;
    default:
      found = false;
      break;
  }

  if(found) active_rich.document.execCommand(action, false, value);

	if (action == 'ForeColor' || action == 'HiliteColor') {
		//change all span tags with fore or back color set to font tags
		var i;
		var spans = active_rich.document.getElementsByTagName('SPAN');

		for (i=0;i<spans.length;i++) {
			if (spans[i].style.color || spans[i].style.backgroundColor) {
				span2font(spans[i]);
			}
		}

		var fonts = active_rich.document.getElementsByTagName('FONT');
		for (i=0;i<fonts.length;i++) {
			var el = fonts[i];
			fix_font_style(fonts[i]);
		}
	}

//  change_toolbar_state(); //set new states of toolbar buttons

}

//check if button 'element' is active
function active_button(element){
//  if(element && element.name != 'off') return true;
  if(element && element.className != 're_img_off') return true;
  return false;
}

//get object of button 'what'
function get_button_object(what){
var obj;

  //get button element
  eval('obj = document.getElementById("'+what+'_'+active_rich.name+'")');
  return obj;
}

//switch on/off fullscreen mode
function full_screen(editor_name){
var full_screen_mode;
var table_obj = document.getElementById(editor_name+'_table_id');
var div_obj = document.getElementById(editor_name+'_div_id');
var action;

	//current border mode
	eval('full_screen_mode = '+active_rich.name+'_rich_full_screen_mode;');

	if(!full_screen_mode && rich_fs_mode_on){
		return;
	}

	full_screen_mode = full_screen_mode==true?false:true;
	set_state('FullScreen', full_screen_mode);
	eval(active_rich.name+'_rich_full_screen_mode = full_screen_mode;');

	if(full_screen_mode){
		div_obj.style.position = "Absolute";
		div_obj.style.zIndex = "999";
		div_obj.style.top = 0;
		div_obj.style.left = 0;
		div_obj.style.width = String(document.documentElement.offsetWidth - 0)+'px';
		div_obj.style.height = String(document.documentElement.offsetHeight - 0)+'px';

		table_obj.style.position = "Absolute";
		table_obj.style.zIndex = "999";
		table_obj.style.top = 0;
		table_obj.style.left = 0;
		table_obj.style.width = String(document.documentElement.offsetWidth - 0)+'px';
		table_obj.style.height = String(document.documentElement.offsetHeight - 0)+'px';

		action = 'none';
	}else{
		table_obj.style.cssText = "";
		div_obj.style.cssText = "";

		action = '';
	}

	//hide wysiwyg areas of all other editors on the page as they do no let
	//cursor to be shown in source mode properly
	var editor = document.getElementsByTagName('IFRAME');
	var i;
	for(i=0;i<editor.length;i++){
		if(editor[i].className == 're_editor' && editor[i].name != editor_name){
			//do nothing if the editor in source mode
			eval('var mode = '+editor[i].name+'_rich_mode;');
			if (mode) {
				editor[i].style.display = action;

				if (action == '') { //restore designMode
					//do try to prevent error messages in source mode
					try{
						eval(editor[i].name + '_id.document.designMode = "On";');
					}catch(error){
					}
				}

			}

		}
	}

	//do try to prevent error messages in source mode
	try{
		eval(editor_name + '_id.document.designMode = "On";');
	}catch(error){
	}

	rich_fs_mode_on = full_screen_mode;

	active_rich.focus();

}

//changes states of toolbar buttons, when they are pressed/released
function mouse_down(down, element){
var mode;
var name;
var obj;

//	element = window.event.srcElement;

	if(element && element.tagName=='IMG'){
		name = get_editor_name(element);
		eval('mode = '+name+'_rich_mode;'); //current mode

		if(!active_button(element)){ //button is inactive
			eval('obj = '+name+'_id;'); //editor of the current button
			if(obj) obj.focus();
			return;
		}

		if(down){ //pressed
			element.className = 're_mouse_down';
		}else{ //released
			element.className = 're_mouse_up';
		}

	}

}

//changes state of toolbar button, when mouse is over it
function mouse_over(over, element){
var element;
var name;
var mode;
var obj;
var id_name;
var acrion_name;
var old_active_rich;
var button_name;
var changing_button;
var mode_name;

//	element = window.event.srcElement;

/*
var i;
var obj = element.style;
	for(i in obj){
		alert(i+' => '+obj[i]);
	}
*/

	if(element && element.tagName=='IMG'){
		name = get_editor_name(element);

		eval('mode = '+name+'_rich_mode;'); //current mode

		eval('obj = '+name+'_id;'); //editor of the current button
		if(!obj) return;

    //in source mode toolbar buttons do not work
//    if(!mode) return;

		if(!active_button(element)) return; //button is inactive

		if(over){ //mouse is over button
			element.className = 're_mouse_over';
		}else{    //mouse is moved from the button
			id_name = String(element.id);
			action_name = id_name.substring(0,id_name.length-name.length-1);

			if(action_name == 'SwitchBorders' ||
				action_name == 'FullScreen'){//switch borders button

				if(action_name == 'SwitchBorders') mode_name = 'border';
					else mode_name = 'full_screen';

				eval('border_mode = '+obj.name+'_rich_'+mode_name+'_mode;');
				old_active_rich = active_rich;
				active_rich = obj;
				set_state(action_name, border_mode);
				active_rich = old_active_rich;
			}else{//common buttons

				button_name = (id_name.split('_'))[0];
				if(button_name == 'Bold' || button_name == 'Italic' ||
				button_name == 'Underline'|| button_name == 'Strikethrough' ||
				button_name == 'SuperScript' || button_name == 'SubScript' ||
				button_name == 'JustifyLeft' || button_name == 'JustifyCenter' ||
				button_name == 'JustifyRight' || button_name == 'JustifyFull' ||
				button_name == 'InsertOrderedList' ||
				button_name == 'InsertUnorderedList'){
					//button changing its state accordingly to text formatting
					changing_button = true;
				}else{
					changing_button = false;
				}

				if(1 || !changing_button ||
					!obj.document.queryCommandState(action_name)){
					element.className = 're_mouse_out';
				}else{ //do button pressed
					element.className = 're_mouse_down';
				}

			}

		}

	}

}

//get editor name of button 'element'
function get_editor_name(element){
var pos;
var button_id_parts;

  if(!element) return '';

  button_id_parts = element.id.match(/([^_]+)_(.+)$/);
  if(button_id_parts) return button_id_parts[2];
  return '';
}

//change current editor mode
function change_mode(){
var mode;
var i;
var text;
var button_id_parts;
var button_name;
var text_area;
var rich_obj;
var border_mode;
var full_screen_mode;

	eval('mode = '+active_rich.name+'_rich_mode;');   //current mode
	//current border mode
	eval('border_mode = '+active_rich.name+'_rich_border_mode;');
	//text area
	eval('text_area = document.getElementById("'+active_rich.name+'_area_id");');
	//editor body
	eval('rich_obj = document.getElementById("'+active_rich.name+'_id");');
	//direction of language
	eval('var dir = '+active_rich.name+'_rich_dir;');
	//current fullscreen mode
	eval('full_screen_mode = '+active_rich.name+'_rich_full_screen_mode;');

	text = get_rich_content(active_rich, true);

	if(mode){ //switch in source mode

		rich_obj.style.display = 'none';
		text_area.style.display = '';

		text_area.focus();

		//do toolbar buttons inactive
		for(i=0;i<document.images.length;i++){

			button_id_parts = document.images[i].id.match(/([^_]+)_(.+)$/);
			if(button_id_parts){
				button_name = button_id_parts[1];
				editor_name = button_id_parts[2];
				if(editor_name == active_rich.name){
					if(button_name != 'Help' && button_name != 'Preview' &&
						button_name != 'Save'){
						show_button(button_name, false);
					}
				}
			}

		}

		//do all select elements inactive
		show_select('FormatBlock', false);
		show_select('FontName', false);
		show_select('FontSize', false);
		show_select('ClassName', false);

		eval(active_rich.name+'_rich_mode = false;');

	}else{ //switch in wysiwyg mode

		rich_obj.style.display = '';
		text_area.style.display = 'none';

		rich_obj.contentWindow.document.designMode = "On";

		rich_obj.contentWindow.document.dir = dir;

		for(i=0;i<document.images.length;i++){

			button_id_parts = document.images[i].id.match(/([^_]+)_(.+)$/);
			if(button_id_parts){
				button_name = button_id_parts[1];
				editor_name = button_id_parts[2];
				if(editor_name == active_rich.name){
					show_button(button_name, true);
				}
			}

		}

		//do all select elements inactive
		show_select('FormatBlock', true);
		show_select('FontName', true);
		show_select('FontSize', true);
		show_select('ClassName', true);

		//redraw 'show borders' button
		set_state('SwitchBorders', border_mode);

		eval(active_rich.name+'_rich_mode = true;');

		active_rich.focus();
	}

	set_rich_content(active_rich, text); //set new content

	//do fullscreen mode button active/inactive
	show_button('FullScreen', full_screen_mode || !rich_fs_mode_on);
	set_state('FullScreen', full_screen_mode);

}

//delete base url from link
function del_base_url(text){

var re = new RegExp(rich_base_url,'gi');

	RegExp.multiline = true;
	return String(text).replace(re, '');

}

//show/hide button 'what'
function show_button(what, show){
var element;

  //get button element
  eval('element = document.getElementById("'+what+'_'+active_rich.name+'")');

  if(!element) return; //the button is absent

  if(show){
    element.className = '';
  }else{
	element.className = 're_mouse_over';

	element.className = 're_img_off';
  }

}

//show/hide select control 'what'
function show_select(what, show){
var element;

  eval('element = document.getElementById("'+what+'_'+active_rich.name+'")');

  if(!element) return; //the element is absent
  element.disabled=!show;

}

//saves text of all editors in textarea objects (for form submit)
function save_in_textarea_all(){
var i;
var mode;
var name;
var text;
var text_area;
var i;
var editor = document.getElementsByTagName('IFRAME');

	for(i=0;i<editor.length;i++){
		if(editor[i].className == 're_editor'){
			eval('mode = '+editor[i].name+'_rich_mode;'); //current mode
			
			if(!mode) continue;

			name = editor[i].name;
			eval("text=get_rich_content("+name+"_id)");
			//text area
			eval('text_area = document.getElementById("'+name+'_area_id");');
			text_area.value = text;

		}
	}
}

//find all document stylesheet rules and add their names to select object
function set_stylesheet_rules(){
var rule_values = new Array();
var rule_found = false;
var sheets;
var sheets_num;
var i,j,k;
var rules;
var rules_num;
var rule_value;
var rule_found;
var rules_select;
var option;
var old_rule_value;

/*
var i;
var obj = active_rich.document.styleSheets[0];
alert(obj);
	for(i in obj){
		alert(i+' => '+obj[i]);
	}
return;
*/

  sheets = active_rich.document.styleSheets;
  sheets_num = sheets.length;

  //there are some stylesheets
  if(sheets_num > 0){

    for(i=0;i<sheets_num;i++){
	  if(!sheets[i]) continue;

	  try {
	      rules = sheets[i].cssRules;
	  } catch(error) {
		  continue;
	  }
	  if(rules == null) continue;
      rules_num = rules.length;

      for(j=0;j<rules_num;j++){
        rule_value = rules[j].selectorText;
        //in rules of the type 'td.toolbar span.delimiter{...}'
        //ignore all chars after space char
        rule_value = (rule_value.split(' '))[0];

        //rules MUST have '.' in their names, as it is user defined rules
        if(rule_value.indexOf(".") >= 0){

          //there is ':' char found in the rule name
          if(rule_value.indexOf(":") >= 0){

            //there are both '.' and ':' chars in the rule name
            rule_value = rule_value.substring(rule_value.indexOf(".")+1,rule_value.indexOf(":"));

          }else{

            //name begins with '.'
            if(rule_value.indexOf(".") == 0){
              rule_value = rule_value.substring(1,rule_value.length);
            }else{
              //name do not begins with '.'
              if(rule_value.indexOf(".") > 0){
                rule_value = rule_value.substring(rule_value.indexOf(".")+1,rule_value.length);
              }
            }

          }

          //prevent adding the the same rule names
          for(k=0;k<rule_values.length;k++){
            if(rule_value == rule_values[k]){
              rule_found = true;
              break;
            }
          }

          //new rule
          if(rule_found != true){
            rule_values[rule_values.length] = rule_value;
          }
          rule_found = false;

        }

      }

    }

    //select object
    eval('rules_select = document.getElementById("ClassName_'+active_rich.name+'")');

    if(rules_select){

      //store selecter rule name
      old_rule_value = rules_select[rules_select.selectedIndex].value;

      //delete old classes from the select object, except first
      while(rules_select.options[2] != null){
		rules_select.options[2].parentNode.removeChild(rules_select.options[2]);
      }

      for(i=0;i<rule_values.length;i++){
        if(rule_values[i] != ''){
          option = document.createElement("option");
          option.value = rule_values[i];
          option.text = rule_values[i];
          rules_select.appendChild(option);
        }
      }

      rules_select.value = old_rule_value;

    }

  }

}

//set class attribute for current text or control element
function set_class(rule_value){
var sel = active_rich.getSelection();
var range = sel.getRangeAt(0);
//var sel = active_rich.document.selection;
//var range = sel.createRange();
var is_set;
var object;
var parentTagName;
var container = range.startContainer;
var parent = container.parentNode;
var container_type = container.nodeType;
var text;

	if(container_type == 1){
		object = container.childNodes[range.startOffset];
	}else{

		if(parent){

			parentTagName = parent.tagName.toUpperCase();
    
			text = String(range);
			if(text == ""){
				object = parent;
			}else{
				if(parentTagName=="SPAN" || parentTagName=="A"){
    
					object = parent;
    
				}else{
					if(rule_value != ""){
						try{
							var span = document.createElement("span");
							span.className = rule_value;
							span.innerHTML = text;
							paste_node(span);
						}catch(error){
							//do nothing on error, just prevent error message to user
						}
					}
					is_set = true
				}

			}

			if(0 && rule_value == "" && parentTagName == "SPAN"){
				object.removeNode(false);
				is_set = true;
			}

		}

	  }

  if(object != null && is_set != true && object.tagName != 'BODY'){
    object.className = rule_value;
  }

}

//insert a node in the current editor
function paste_node(node) {
var sel = active_rich.getSelection();
var range = sel.getRangeAt(0);
var container = range.startContainer;
var container_type = container.nodeType;
var parent = container.parentNode;
	range.deleteContents(); //remove content selected
var start_pos = range.startOffset;
var end_pos = range.endOffset;

	if (container_type == 3) { //insert inside text

		sel.removeAllRanges();
		range=document.createRange();

		//text of the current container
		var text_node = document.createTextNode(container.nodeValue);

		//text before selection
		var prev_text = text_node.nodeValue.substr(0, start_pos);
		//text after selection
		var post_text = text_node.nodeValue.substr(end_pos);

		//make nodes from texts
		var prev_node = document.createTextNode(prev_text);
		var post_node = document.createTextNode(post_text);

		//insert nodes before existing
		parent.insertBefore(post_node, container);
		parent.insertBefore(node, post_node);
		parent.insertBefore(prev_node, node);

		parent.removeChild(container); //delete old container

		range.setStart(post_node, 0);
		range.setEnd(post_node, 0);

		//move cursor at end of text changed
		sel.addRange(range);

	} else {
		container.insertBefore(node, container.childNodes[start_pos]);
//		container.removeChild(container.childNodes[start_pos]); //delete selected object
	}

}

//show/hide borders of invisible objects
function set_borders(border_mode){
var tables = active_rich.document.getElementsByTagName("TABLE");
var forms = active_rich.document.getElementsByTagName("FORM");
//var tables = active_rich.document.body.getElementsByTagName("TABLE");
//var forms = active_rich.document.body.getElementsByTagName("FORM");
var page_mode;
var i,j,k;
var width;
var height;
var rows;
var cells;

  eval('page_mode = active_rich.window.'+active_rich.name+'_rich_page_mode;'); //current page mode

  for(i=0;i<tables.length;i++){

    if(border_mode){
      tables[i].style.border = '1px dashed #CCCCCC';
    }else{

      width = tables[i].style.width;
      height = tables[i].style.height;

      tables[i].removeAttribute("style");

      if(width) tables[i].style.width = width;
      if(height) tables[i].style.height = height;

    }

    rows = tables[i].rows;
    for(j=0;j<rows.length;j++){
      cells = rows[j].cells;
      for(k=0;k<cells.length;k++){
        if(border_mode){
          cells[k].style.border = '1px dashed #CCCCCC';
        }else{
          cells[k].removeAttribute("style");
        }
      }
    }

  }

  //show form borders
  for(i=0;i<forms.length;i++){
    if(border_mode){
      forms[i].style.border = '1px dotted #FF0000';
    }else{
      forms[i].removeAttribute("style");
    }
  }

//active_rich.document.documentElement.innerHTML
  if(!page_mode){
//    active_rich.document.body.innerHTML = '<body>'+active_rich.document.body.innerHTML+'</body>';
  }else{
//    active_rich.document.body.innerHTML = active_rich.document.documentElement.outerHTML;
  }
  active_rich.document.body.innerHTML = active_rich.document.body.innerHTML;
}

//change border mode
function switch_borders(change){
var border_mode;

  //current border mode
  eval('border_mode = '+active_rich.name+'_rich_border_mode;');

  if(change){//change border visibility
    border_mode = border_mode==true?false:true;
    set_state('SwitchBorders', border_mode);
    eval(active_rich.name+'_rich_border_mode = border_mode;');
  }

  set_borders(border_mode);

}

//changes state of button 'what' to value
function set_state(what, value){
var element;

	//object to change
	eval('element = document.getElementById("'+what+'_'+active_rich.name+'")');

	if(element){
		if(value){ //pressed
			element.className = 're_mouse_down';
		}else{    //released
			element.className = 're_mouse_out';
		}
	}

}

//show dialog window to create/edit objects (table, image, ets)
function show_dialog(action, object){
var mode;
var is_control;
var attrib;
var parameters;
var link_text;
var element;
var link;
var i;
var param;
var outerHTML = '';
var text_class;
var button_object;
var is_br = false;

  eval('mode = '+active_rich.name+'_rich_mode;'); //current mode

  active_rich.focus(); //set focus on active editor

  //in source mode toolbar dialog buttons do not work
  if(!mode && !(action == 'Help' || action == 'Preview' ||
	action == 'Save')) return;

  if(mode){
	try{
var sel = active_rich.getSelection();
var r = sel.getRangeAt(0);
var container = r.startContainer;
var container_type = container.nodeType;
	}catch(error){
		return;
	}
  }

	//check, if any control element is active (i.e. image or table)
	if(container_type == 1){
		is_control = true;
		element = container.childNodes[r.startOffset];
		if (!element) return;
		if (element.tagName == 'BR') is_br = true;
	  }else is_control = false;

  switch(action){
    case "CreateTable": //create table
      if(0&&is_control){ //table already exists
//        if(element.tagName != 'TABLE') break;
        show_dialog("EditTable", element);
        break;
      }

//      parameters = show_table_dialog("");

//      if(parameters) create_table(parameters);

      show_table_dialog(null, true);
      break;

    case "EditTable": //edit table

/*
      attrib = get_table(object); //get values of table attributes
      parameters = show_table_dialog(attrib);

      if(parameters) edit_object(object, parameters);
*/

		if (get_previous_object(container.parentNode,'TABLE')) {
			show_table_dialog();
		}
      break;

    case "EditCell": //edit table cell
      //no selected text or controls
      if(is_control) break;

      if(container.parentNode){ //check, if text is inside a reference
        var td = get_previous_object(container.parentNode,'TD');
		if(td){
			var w = 330;
			var h = 180;
			var win = window.open(rich_path+"dialog_cell_ns."+rich_dialog_ext+"?lang="+eval(active_rich.name+"_lang")+"&110903c","dialog_cell"+eval(active_rich.name+"_lang"),"modal=yes,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2)+"\"");
			win.focus();
		}
      }

      break;

    case "CreateImage": //create image
      if(is_control){ //image already exists
//        if(element.tagName != 'IMG') break;
        show_dialog("EditImage", element);
        break;
      }

//      parameters = show_image_dialog("");

//      if(parameters) create_image(parameters);
      show_image_dialog();

      break;

    case "EditImage": //edit image

//      attrib = get_image(object); //get values of image attributes

/*
	for(i in attrib){
		alert(i+' => '+attrib[i]);
	}
*/
      show_image_dialog();

//      if(parameters) edit_object(object, parameters);
      break;

    case "CreateFlash": //create flash
      if(is_control && r.commonParentElement){ //flash already exists
        element = r.commonParentElement();
        if(element.tagName != 'OBJECT') break;
        show_dialog("EditFlash", element);
        break;
      }

      parameters = show_flash_dialog("");

      if(parameters) create_flash(parameters);
      break;

    case "EditFlash": //edit flash

      edit_flash(object);

      break;

    case "CreateLink": //create reference

      //no selected text or controls
      if(!is_control && container_type != 3) break;

      if(container.parentNode){ //check, if text is inside a reference
        link = get_previous_object(container.parentNode,'A');
      }

      if(link){ //it is a reference yet - edit it
        show_dialog("EditLink", link);
        break;
      }

      if(!is_control){
		var start_pos = r.startOffset;
		var end_pos = r.endOffset;

		//text of the current container
		var text_node = document.createTextNode(container.nodeValue);

		//text of the selection
		var link_text = text_node.nodeValue.substr(start_pos, end_pos-start_pos);
		if(link_text == '') break;
        if(link_text.match(/<\/?A/i)) break; //there is a link inside
      }

      show_link_dialog("");

//      parameters = show_link_dialog("");

//      if(parameters) create_link(parameters);
      break;

    case "EditLink": //edit reference

/*
      attrib = get_link(object); //get values of image attributes
      parameters = show_link_dialog(attrib);

      if(parameters) edit_object(object, parameters);
*/
      show_link_dialog();
      break;

    case "Help": //show help window

	  var name = active_rich.name;
	  var lang = eval(name+"_lang");
      window.open(rich_path+"lang/help_"+lang+"."+rich_dialog_ext+"?lang="+lang,"re_help_"+lang,
                  "toolbar=0,scrollbars=yes,resizable=yes");
      break;

    case "Preview": //preview of the current editor content
		var pre_window;
		var editor_content;
		var page_mode;
		var border_mode;
		var name;
		var abs_path;
		var i;

		//get the current editor content
		name = active_rich.name;
		eval('var mode = '+active_rich.name+'_rich_mode;');   //current mode

		//default stypesheets
		eval('var rich_css = '+name+'_rich_css;');

		editor_content = get_rich_content(active_rich);

		editor_content += get_default_stylesheets();

		pre_window = window.open('', '', 'toolbar=yes,location=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes,titlebar=1');
		pre_window.document.write(editor_content);
		pre_window.document.close();

      break;

    case "CreateForm": //insert a form
      if(!is_control || is_br){
		show_form_dialog("form");
	  }
      break;

    case "CreateText": //insert a text field
	if(!is_control || is_br ||
		is_control && element.tagName == 'INPUT'
		&& (element.type.toUpperCase() == 'TEXT' ||
		element.type.toUpperCase() == 'PASSWORD')){
		show_form_dialog("text");
	}
	break;

    case "CreateTextArea": //insert a text area
	if(!is_control || is_br ||
		is_control && element.tagName == 'TEXTAREA'){
		show_form_dialog("textarea");
	}
	break;

    case "CreateButton": //insert a button
	if (!is_control || is_br ||
		is_control && element.tagName == 'INPUT' &&
		(element.type.toUpperCase() == 'BUTTON' ||
			element.type.toUpperCase() == 'RESET' ||
			element.type.toUpperCase() == 'SUBMIT')) {
		show_form_dialog("button");
	}
      break;

    case "CreateHidden": //insert a hidden field
	if(!is_control || is_br ||
		is_control && element.tagName == 'INPUT'
		&& element.type.toUpperCase() == 'HIDDEN'){
		show_form_dialog("hidden");
	}
	break;

    case "CreateCheckBox": //insert a checkbox
    case "CreateRadio": //insert a radiobox
	var element_type;
	if(action == 'CreateCheckBox'){
		element_type = 'checkbox';
	}else{
		element_type = 'radio';
	}

	if(!is_control || is_br ||
		is_control && element.tagName == 'INPUT' &&
		element.type.toUpperCase() == element_type.toUpperCase()){
		show_form_dialog(element_type);
	}
	break;

    case "CreateSelect": //insert a list box
	if(!is_control || is_br ||
		is_control && element.tagName == 'SELECT'){
		show_form_dialog("select");
	}
	break;

    case "InsertSnippet": //insert a snippet
      if(!is_control || is_br){
		show_form_dialog("snippet");
	  }
      break;

    case "PasteWord": //paste word formatted text
      if(!is_control || is_br){
		show_form_dialog("paste_word");
	  }

      break;

    case "PageProperties": //page properties

      show_page_dialog();
      break;

    case "Find": //show find&replace dialog

		var name = active_rich.name;
		var lang = eval(name+"_lang");
		var w = 400;
		var h = 150;

		var win = window.open(rich_path+"dialog_find."+rich_dialog_ext+"?lang="+lang+"&browser=ns&110903b","dialog_find"+name,"modal=yes,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2)+"\"");
		win.focus();
      break;

    default:
      break;
  }

}

//show dialog window to create/edit table
function show_table_dialog(name, create_mode){
	return show_object_dialog('table', name, create_mode);

}

//show dialog window to create/edit image
function show_image_dialog(attrib, name){
	return show_object_dialog('image', name);
}

//show dialog window to create/edit flash
function show_flash_dialog(attrib, name){
	return show_object_dialog('flash', name);
}

//show dialog window to create/edit reference
function show_link_dialog(attrib, name){
	return show_object_dialog('link', name);
}

//show dialog window to edit page properties
function show_page_dialog(){
	return show_object_dialog('page');
}

//show dialog window to create/edit various objects
function show_object_dialog(object, name, create_mode){
var w;
var h;

	if (!object) return;
	if (!name) var name = active_rich.name; //name of current editor
	if (create_mode) var do_create = 'true';
		else var do_create = '';

	switch(object){
		case 'table':
			w = 350;
			h = 415;
			break;
		case 'image':
			w = 415;
			h = 435;
			break;
		case 'flash':
			w = 410;
			h = 440;
			break;
		case 'link':
			w = 410;
			h = 440;
			break;
		case 'page':
			w = 350;
			h = 430;
			break;
		default:
			return;
	}

	var win = window.open(rich_path+"dialog_"+object+"_ns."+rich_dialog_ext+"?files_path="+eval(name+"_files_path")+"&files_url="+eval(name+"_files_url")+"&lang="+eval(name+"_lang")+"&name="+name+"&do_create="+do_create+"&110903f","dialog_"+object+eval(name+"_lang"),"modal=yes,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2)+"\"");
	win.focus();

//	return showModalDialog(rich_path+"dialog_"+object+".php?files_path="+eval(name+"_files_path")+"&files_url="+eval(name+"_files_url")+"&lang="+eval(name+"_lang")+"&110903b", attrib,
//                           "dialogWidth:"+w+"px; dialogHeight:"+h+"px; status:no; scroll:no; help:no");

}

//show dialog window to pick color
function pick_color(name, action, color){
var color_str = '';
	if(!name) var name = active_rich.name; //name of current editor

	if (color) {
		color = dec2hex(color);
		color_str = "&color=%23"+color;
	}

	var w = 445;
	var h = 140;
	var win = window.open(rich_path+"pick_color_ns."+rich_dialog_ext+"?lang="+eval(name+"_lang")+'&action='+action+"&name="+name+color_str+"&110903b","dialog_color","modal=yes,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2)+"\"");
	win.focus();
}

//search among parents an object with tag tag_name
function get_previous_object(obj,tag_name) {
  if(obj){

    //to prevent search outside editor
    if(obj.className == "re_editor") return null;

    if(obj.tagName != tag_name){
      obj = get_previous_object(obj.parentNode, tag_name);
    }
  }
  return(obj);
}

//inserts row into current table just after current row
function insert_row(ins_to){
var sel = active_rich.getSelection();
var range = sel.getRangeAt(0);
var container = range.startContainer;
var tr;
var table;
var row;
var i;
var curr_colspan;

	tr = get_previous_object(container.parentNode,'TR');
	table = get_previous_object(tr,'TABLE');

	if(table != null){

		var cell_width = 100/tr.cells.length+'%';

		row = table.insertRow(tr.rowIndex+ins_to); //create new row
		for(i=0;i<tr.cells.length;i++){ //fill the row with columns
			var cell = row.insertCell(i);
			cell.innerHTML = '&nbsp;';

			var attr = new Array('width', 'height', 'vAlign', 'bgColor');
			var j;
			for (j in attr) {
				var attr_value = eval('tr.cells[i].getAttribute("'+attr[j]+'")');
				eval('if(attr_value) cell.setAttribute("'+attr[j]+'", attr_value)');
			}

//			row.cells[i].setAttribute("width", cell_width);

			//take colspan values from the previous row cells
			curr_colspan = tr.cells[i].colSpan;
			if(curr_colspan > 1){
				cell.colSpan = curr_colspan;
			}
		}

	}

}

//deletes current row from current table
function delete_row(){
var sel = active_rich.getSelection();
var range = sel.getRangeAt(0);
var container = range.startContainer;
var tr;
var table;

	tr = get_previous_object(container.parentNode,'TR');
	table = get_previous_object(tr,'TABLE');

	if(table != null){
		if(table.rows.length <= 1){
			table.parentNode.removeChild(table); //it is the last row - delete whole table
		}else{
			table.deleteRow(tr.rowIndex); //delete row
		}

	}

}

//insert column in current table just after current column
function insert_column(ins_to){
var sel = active_rich.getSelection();
var range = sel.getRangeAt(0);
var container = range.startContainer;
var td;
var table;
var i;
var curr_rowspan;
var cell_index;
var rowspan_index;
var curr_index;

	td = get_previous_object(container.parentNode,'TD');
	table = get_previous_object(td,'TABLE');

	if(table != null){

		curr_index = td.cellIndex;
		//insert new cells in each row
		for(i=0;i<table.rows.length;i++){

			if(curr_index+ins_to > table.rows[i].cells.length){
				cell_index = table.rows[i].cells.length;
			}else{
				cell_index = curr_index+ins_to;
			}

			if(curr_index < table.rows[i].cells.length){
				rowspan_index = curr_index;
			}else{
				rowspan_index = table.rows[i].cells.length-1;
			}

			var j = -1;
			var attr = new Array('width', 'height', 'vAlign', 'bgColor');

			//take rowspan values from current column cells
			if (rowspan_index<0) curr_rowspan = 1;
				else {
					var tr = table.rows[i].cells[rowspan_index];
					curr_rowspan = tr.rowSpan;

					for (j in attr) {
						eval('var '+attr[j]+'=tr.getAttribute("'+attr[j]+'")');
					}
				}

			var cell = table.rows[i].insertCell(cell_index);
			cell.innerHTML = '&nbsp;';

			if(j != -1){
				for (j in attr) {
					eval('if('+attr[j]+') cell.setAttribute("'+attr[j]+'", '+attr[j]+')');
				}
			}

			if(curr_rowspan > 1){
				cell.rowSpan = curr_rowspan;
				i += curr_rowspan-1; //next curr_rowspan-1 cells are from another column
			}
		}

	}

}

//delete current column from current table
function delete_column(){
var sel = active_rich.getSelection();
var range = sel.getRangeAt(0);
var container = range.startContainer;
var td;
var table;
var i;
var tr;
var cell_index;

	td = get_previous_object(container.parentNode,'TD');
	table = get_previous_object(td,'TABLE');

	if (table != null) {
		cell_index = td.cellIndex;

		//delete cells from each row
		for (i=0;i<table.rows.length;i++) {

			tr = table.rows[i];
			if (tr.cells.length<=1) {
				//last cell in a row -- delete the row
				table.deleteRow(i);
				i--;
			} else {
				if (cell_index < tr.cells.length) {
					if (tr.cells[cell_index].rowSpan>1) {
						i+=tr.cells[cell_index].rowSpan-1;
					}
					tr.deleteCell(cell_index);
				}
			}

		}

		if (table.rows.length == 0) {
			//there are no rows - delete table
			table.parentNode.removeChild(table);
		}

	}

}

//insert cell in current table just after current cell
function insert_cell(){
var sel = active_rich.getSelection();
var range = sel.getRangeAt(0);
var container = range.startContainer;
var td;
var tr;

	td = get_previous_object(container.parentNode,'TD');
	tr = get_previous_object(td,'TR');

	if(tr != null){
		//insert new cell after current one
		tr.insertCell(td.cellIndex+1);
		var new_td = tr.cells[td.cellIndex+1];
		new_td.innerHTML = '&nbsp;';
		var width = tr.cells[td.cellIndex].width;
//		new_td.setAttribute("width", width);
	}

}

//delete current cell from current table
function delete_cell(){
var sel = active_rich.getSelection();
var range = sel.getRangeAt(0);
var container = range.startContainer;
var td;
var table;
var tr;

	td = get_previous_object(container.parentNode,'TD');
	tr = get_previous_object(td,'TR');
	table = get_previous_object(tr,'TABLE');

	if(table != null){

		if(tr.cells.length<=1){
			//it is the last cell in the row - delete row
			table.deleteRow(tr.rowIndex); //delete row

			if(table.rows.length == 0){
				//there are no rows - delete table
				table.parentNode.removeChild(table);
			}
		}else{
			tr.deleteCell(td.cellIndex);
		}

	}

}

//merge cells
function merge_cells(){ 
var sel = active_rich.getSelection();
var range = sel.getRangeAt(0);
var container = range.startContainer;
var td;
var tr;
var next_td;

	td = get_previous_object(container.parentNode,'TD');
	tr = get_previous_object(td,'TR');

	//check if the current cell is not last in the row
	if(tr != null && td.cellIndex < tr.cells.length-1){ 
		//increase current cell colspan value by next cell colspan value
		//and delete the next cell
		next_td = tr.cells[td.cellIndex+1];
		td.innerHTML += next_td.innerHTML; 
		td.colSpan += next_td.colSpan;
		tr.deleteCell(td.cellIndex+1); 
	} 

} 

//split cell
function split_cell(){
var sel = active_rich.getSelection();
var range = sel.getRangeAt(0);
var container = range.startContainer;
var td;
var tr;

	td = get_previous_object(container.parentNode,'TD');
	tr = get_previous_object(td,'TR');

	//split cells with colSpan > 1 only
	if(tr != null && td.colSpan > 1){
		td.colSpan--;
		tr.insertCell(td.cellIndex+1);
		var new_td = tr.cells[td.cellIndex+1];
		new_td.innerHTML = '&nbsp;';
		var width = tr.cells[td.cellIndex].width;
		new_td.setAttribute("width", width);
	}

} 

//insert a special character
function insert_char(){
	var w = 450;
	var h = 320;

	var win = window.open(rich_path+"dialog_char.php?lang="+eval(active_rich.name+"_lang")+"&110903","dialog_char_"+eval(active_rich.name+"_lang"),"modal=yes,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2)+"\"");
	win.focus();
}

function insert_this_char(chr){
var text_node = document.createTextNode(chr);

var el = document.createElement("SPAN"); //create object - tag A
	el.innerHTML = chr;

var i;
	for(i in document){
//		alert(i+' | '+document[i]);
	}
	var temp_rich = active_rich;
	active_rich = opener.active_rich;

//	paste_node(text_node); //insert the character in editor
	paste_node(el); //insert the character in editor

	active_rich = temp_rich;

}

//show dialog window to create/edit form
function show_form_dialog(action){
var w;
var h;

  switch(action){
    case 'form':
      w = 351;
      h = 160;
      break;
    case 'text':
      w = 243;
      h = 300;
      break;
    case 'textarea':
      w = 250;
      h = 285;
      break;
    case 'button':
      w = 253;
      h = 200;
      break;
    case 'hidden':
      w = 300;
      h = 160;
      break;
    case 'checkbox':
      w = 283;
      h = 205;
      break;
    case 'radio':
      w = 253;
      h = 205;
      break;
    case 'select':
      w = 331;
      h = 310;
      break;

    case 'snippet':
      w = 305;
      h = 363;
      break;
    case 'paste_word':
      w = 305;
      h = 300;
      break;
    default:
      w = 331;
      h = 200;
      break;
  }
	var win = window.open(rich_path+"dialog_form."+rich_dialog_ext+"?action="+action+"&browser=ns&lang="+eval(active_rich.name+"_lang")+"&110903b","dialog_form"+action+eval(active_rich.name+"_lang"),"modal=yes,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2)+"\"");
	win.focus();

//	return showModalDialog(rich_path+"dialog_form.php?action="+action+"&lang="+eval(active_rich.name+"_lang")+"&110903aaaaaa", attrib,
//                           "dialogWidth:"+w+"px; dialogHeight:"+h+"px; status:no; scroll:no; help:no");

}

//insert a snippet value in the editor
function insert_snippet(value){
var sel = active_rich.getSelection();
var range;
var snippets;


	if(sel) range = sel.getRangeAt(0);
		else return;

	var container = range.startContainer;
	var container_type = container.nodeType;
	var is_br = false;

	if(container_type == 1){
		var element = container.childNodes[range.startOffset];
		if (element && element.tagName == 'BR') is_br = true;
	}

	if(value!=null && range && (container_type != 1 || is_br)){

		var s_parts = String(value).match(/^([^_]*)_([0-9]+)$/);
		if(!s_parts) return;
		var s_group = s_parts[1];
		var s_value = s_parts[2];

		eval('snippets = '+active_rich.name+'_snippets;'); //array of snippets
		if(snippets && snippets[s_group] && snippets[s_group][s_value] &&
			snippets[s_group][s_value][1]){
			paste_html(snippets[s_group][s_value][1]);
		}

	}

}

function paste_html(html){
var border_mode;
var el = document.createElement("SPAN"); //create object - tag SPAN

	//current border mode
	eval('border_mode = '+active_rich.name+'_rich_border_mode;');

	el.innerHTML = html;

	paste_node(el); //insert content in editor

	//delete outer span tag
	if (el.parentNode && el.childNodes) {
		var i;
		var child_nodes_length =  el.childNodes.length;
		for (i=0;i<child_nodes_length;i++) {
			if (el.childNodes[i]) {
				var new_node = el.childNodes[i].cloneNode(el.childNodes[i]);
				el.parentNode.insertBefore(new_node, el);
			}
		}
		el.parentNode.removeChild(el);
	}

	//set/unset borders
	set_borders(border_mode);
}

//paste MSWord formatted text from clipboard
function paste_word(html){

	paste_html(clean_code(html));
	active_rich.focus(); //set focus on active editor

}

function clean_code(code) {    
  // get rid of silly space tags
  code = code.replace(/&nbsp;/gi, "");
  // gets rid of all xml stuff... <xml>,<\xml>,<?xml> or <\?xml>
  code = code.replace(/<\\?\??xml[^>]*>/gi, "");
  // get rid of ugly colon tags <a:b> or </a:b>
  code = code.replace(/<\/?\w+:[^>]*>/gi, "");
  // removes all empty <p> tags
  code = code.replace(/<p([^>])*>(&nbsp;)*\s*<\/p>/gi,"");
  // removes all span tags
//  code = code.replace(/<span[^>]*>([^<]*)<\/span>/gi,"$1")
  code = code.replace(/<\/?span[^>]*>/gi,"");
  // removes all Class attributes on a tag eg. '<p class=asdasd>xxx</p>' returns '<p>xxx</p>'
  code = code.replace(/<([\w]+) class=([^ |>]*)([^>]*)/gi, "<$1$3");
  // removes all style attributes eg. '<tag style="asd asdfa aasdfasdf" something else>' returns '<tag something else>'
  code = code.replace(/<([^>]+) style="([^"]*)"([^>]*)/gi, "<$1$3");

  return code
}

//dont need to restore borders in change_mode - works faster
function get_rich_content(editor, dont_restore_borders) {

	if (!editor) return '';

var editor_content;
var old_active_rich = active_rich;
var i;

	active_rich = editor;

	//get the current editor content
	var name = active_rich.name;
	eval('var mode = '+active_rich.name+'_rich_mode;');   //current mode
	var xhtml_mode = get_xhtml_mode(); //must be after 'active_rich = editor;'

	if(!mode){ //source code mode
		//text area
		eval('var text_area = document.getElementById("'+active_rich.name+'_area_id");');

		editor_content = text_area.value;

	}else{
		eval('var page_mode = '+name+'_rich_page_mode;'); //current page mode
		//current border mode
		eval('var border_mode = '+name+'_rich_border_mode;');
		//absolute paths
		eval('var abs_path = '+name+'_rich_absolute_path;');

		if(border_mode){
			set_borders(false);
		}

		if (xhtml_mode) {

			//document lang
			eval('var doc_lang = '+active_rich.name+'_rich_doc_lang;');
			//document charset
			eval('var doc_charset = '+active_rich.name+'_rich_doc_charset;');

			if(!page_mode){
				editor_content = get_xhtml(active_rich.document.documentElement,
											doc_lang, doc_charset);
			}else{
				editor_content = get_xhtml(active_rich.document,
											doc_lang, doc_charset);
			}

		} else {

			editor_content = active_rich.document.documentElement.innerHTML;
    
			if(!page_mode){
				editor_content = editor_content.replace(/<\/?head>/gi, "");
				editor_content = editor_content.replace(/<\/?body>/gi, "");
			}else{
				editor_content = '<html>'+editor_content+'</html>';
			}

		}

		editor_content = delete_default_stylesheets(editor_content);

		if(!abs_path) editor_content = del_base_url(editor_content);

		if(border_mode && !dont_restore_borders){
			set_borders(true);
		}

	}

	active_rich = old_active_rich;

	return editor_content;
}

//add default seylesheet tags
function get_default_stylesheets(){
var i;
var text = '';

	//default stylesheets
	eval('var rich_css = '+active_rich.name+'_rich_css;');

	//add links to default stylesheets
	for (i in rich_css) {
		var link_text = '<link rel="stylesheet" href="'+rich_css[i]+'" type="text/css">';
		text += link_text;
	}

	return text;
}

//remove all default stylesheet tags
function delete_default_stylesheets(editor_content){
var i;
var name = active_rich.name;
var xhtml_mode = get_xhtml_mode();

//remove default stylesheets' tags
eval('var rich_css = '+name+'_rich_css;');

	if (xhtml_mode) var ch = " /";
		else var ch = "";

	//remove links to default stylesheets
	for (i in rich_css) {
		var re = new RegExp('<link rel="stylesheet" href="'+rich_css[i]+'" type="text/css"'+ch+'>','gi');
		var re2 = new RegExp('<link type="text/css" href="'+rich_css[i]+'" rel="stylesheet"'+ch+'>','gi');
		RegExp.multiline = true;

		editor_content=editor_content.replace(re2,'');
		editor_content=editor_content.replace(re,'');
	}

	return editor_content;
}

//return content of editor with name 'name' - user javascript API function
function get_rich(name) {
	if (!name) return '';

	if (!active_rich) {
	var base_info = get_editor_base_info(name);

		eval('var text_area = document.getElementById("'+base_info['name']+'_ed'+base_info['id']+'_area_id");');
		return text_area.value;
	}

	return get_rich_content(get_editor_id(name));
}

//set content to editor with name 'name'
function set_rich(name, content) {
	if (!name) return '';

	if (!active_rich) {
	var base_info = get_editor_base_info(name);

		eval('var text_area = document.getElementById("'+base_info['name']+'_ed'+base_info['id']+'_area_id");');
		text_area.value = content;
		return true;
	}

	return set_rich_content(get_editor_id(name), content);
}

//get editor id by its name
function get_editor_id(name) {

	var base_info = get_editor_base_info(name);
	eval('var editor = '+base_info['name']+'_ed'+base_info['id']+'_id;'); //get editor's id

	return editor;
}

//get editor base info (common for iframe and textarea) by its name
function get_editor_base_info(name) {
	var base_info = new Array();
	base_info['id'] = '';
	base_info['name'] = name;

	var ar_pos = name.indexOf("[");
	var id = '';
	if (ar_pos > 0) {
		var ar_end_pos;
		ar_end_pos = name.indexOf("]", ar_pos);
		if (ar_end_pos > 0) {
			base_info['id'] = name.substring(ar_pos+1, ar_end_pos);
			base_info['name'] = name.substring(0, ar_pos);
		}
	}

	return base_info;
}

//write html text from variable content to editor
function set_rich_content(editor, content){
	if (!editor) return;

var mode;
var page_mode;
var border_mode;
var i;
var text;
var button_id_parts;
var button_name;
var editror_name;
var text_area;
var rich_obj;
var old_active_rich = active_rich;

	active_rich = editor;

	eval('mode = '+active_rich.name+'_rich_mode;');   //current mode
	eval('page_mode = '+active_rich.name+'_rich_page_mode;'); //current page mode
	//current border mode
	eval('border_mode = '+active_rich.name+'_rich_border_mode;');
	//text area
	eval('text_area = document.getElementById("'+active_rich.name+'_area_id");');
	//editor body
	eval('rich_obj = document.getElementById("'+active_rich.name+'_id");');
	var xhtml_mode = get_xhtml_mode(); //must be after 'active_rich = editor;'

	text = content;

	if(!mode){ //source mode

		if(!page_mode || xhtml_mode){
		}else{
			text = '<html>'+text+'</html>';
		}

		text_area.value = text;

	}else{ //wysiwyg mode

		if(!page_mode){

			if (!text) text = '<br>';

			text += get_default_stylesheets();

//		rich_obj.contentWindow.document.designMode = "On";
			var head_tag = active_rich.document.getElementsByTagName('HEAD')[0];
			head_tag.innerHTML = '';
			active_rich.document.body.innerHTML = text;
		}else{

			var head = '';
			var body = '<br>';

			if (text != '') {

				var head_parts = text.split(/<[\/]?head[^>]*>/);
				if (head_parts[1]) head = head_parts[1];
        
				var body_parts = text.split(/<[\/]?body[^>]*>/);
				if (body_parts[1]) body = body_parts[1];
        
        
				//parse body attributes
				var body_attr = null;
				var body_temp = text.split(/<body /);
				if (body_temp[1]) {
					body_attr = body_temp[1].split(/>/)[0];
				}
				var attribs;
				if(body_attr){
					attribs = body_attr.split(/[ \t]+/);
				}else attribs = null;
        
        
//				rich_obj.contentWindow.document.designMode = "On";

			}
//			rich_obj.contentWindow.document.designMode = "On";

			active_rich.document.body.innerHTML = '';
			active_rich.document.body.innerHTML = body;
			var head_tag = active_rich.document.getElementsByTagName('HEAD')[0];

			//delete old body tag attributes
			var old_attr = active_rich.document.body.attributes;
			var old_attr_length = old_attr.length;
			for (i=0;i<old_attr_length;i++) {
				active_rich.document.body.removeAttribute(old_attr.item(0).name);
			}

			//set new body tag attributes
			if (body_attr) {
				for (i in attribs){
					var value = attribs[i].match(/([^=]*)=(.*)/);
					if(value){
						if(value[1] == 'style'){
							active_rich.document.body.style = value[2];
						}else active_rich.document.body.setAttribute(value[1],value[2].replace(/\"/g,''));
					}
				}
			}
        
			head += get_default_stylesheets();
        
			head_tag.innerHTML = head;
        
		}
        
		//set borders
		if(border_mode){
			set_borders(true);
		}
        
		set_stylesheet_rules();//update class info

	}

	active_rich = old_active_rich;

	return true;
}

function get_xhtml_mode(){

	//xhtml mode
	eval('var xhtml_mode = '+active_rich.name+'_rich_xhtml_mode;');

	try { //check if xhtml jscript function loaded
		var is_xhtml = get_xhtml?true:false;
	} catch(e) {
		var is_xhtml = false;
	}

	return xhtml_mode&&is_xhtml?true:false;
}

//convert span object el to font
function span2font(el){
	if (!el) return;

var i,j;

var child_spans = el.getElementsByTagName('SPAN');
var child_length = child_spans.length;

	//parse child span tags
	for (i=0;i<child_length;i++) {
		span2font(child_spans[i]);
	}

var new_node = document.createElement('FONT');
	new_node.innerHTML = el.innerHTML;

var attr = el.attributes;
var attr_length = attr.length;

	//copy attributes to font tag
	for (j=0;j<attr_length;j++) {
		if (!attr[j].specified) continue;

		var attr_name = attr[j].nodeName.toLowerCase();
		if (attr_name = 'style') {
			new_node.style.cssText = el.style.cssText;
		} else {
			if (attr_name == 'class') {
				new_node.className = el.className;
			} else {
				new_node.setAttribute(attr_name, el.getAttribute(attr_name, 2)); 
			}
		}

	}

	el.parentNode.insertBefore(new_node, el);
	el.parentNode.removeChild(el);

}

//fix font style attribute if fore or back color unset
function fix_font_style(el){
		var css_text = String(el.style.cssText);
		css_text = css_text.replace('background-color: rgb(0, 0, 1);', '');
		css_text = css_text.replace('color: rgb(0, 0, 1);', '');
		css_text = css_text.replace(/(^\s+)|(\s+$)/,'');
		if (css_text == '') el.removeAttribute('style');
			else el.style.cssText = css_text;
}

//convert color from decimal value 'rgb(n, n, n)' to heximal
function dec2hex(num) {
var colors = num.match(/rgb\(([0-9]+), ([0-9]+), ([0-9]+)\)/);
var i;
var hex_num = '';

	if (colors) {
		for (i=1;i<=3;i++) {
			var d1 = colors[i]>>4;
			var d2 = colors[i]&0x0f;
    
			hex_num += d1.toString(16)+d2.toString(16);
		}
		return hex_num;
	}
	return 'ffffff';
}

//determine where to insert row/column
function insert_to(action) {
	var lang = eval(active_rich.name+"_lang");

	var w = 300;
	var h = 100;
	var win = window.open(rich_path+"dialog_adv_table."+rich_dialog_ext+"?lang="+lang+"&action="+action+"&browser=ns&110903f","dialog_adv_table"+lang,"modal=yes,width="+w+",height="+h+",left="+((screen.width-w)/2)+",top="+((screen.height-h)/2)+"\"");
	win.focus();
}

//error message handler
function no_error(){
  return true;
}
