function CjWysiwyg(name, width, height, style)
{
	var text = '<textarea id="' + name + '_wysi" width="' + width + 'px" height="' + height + 'px"></textarea>';
	var html = '<iframe id="' +  name + '_wysi" width="' + width + 'px" height="' + height + 'px" frameborder="no"></iframe>'
	var main = this;
	var frame = null;
	var active = document.designMode;
	var conteiner = document.getElementById(name);
	var onloadfunc = function(){};
	
	this.getContent = function()
	{
		return active ? frame.document.body.innerHTML : '';
	}
	
	this.setContent = function(html)
	{
		if (html == undefined) html = '';
		frame.document.body.innerHTML = html;
		//if (html == '') main.setStyles();
	}
	
	this.setStyles = function(newstyle)
	{
		//frame.document.readyState, frame.document.styleSheets
		
		if (newstyle != undefined) style = newstyle;
		if ( ! frame.document || ! frame.document.body) return;
		if (frame.document.getElementsByTagName("style").length == 0)
		{
			var st = frame.document.createElement("style");
			st.type = "text/css";
			frame.document.getElementsByTagName("head")[0].appendChild(st);
		}
		if (frame.document.styleSheets[0])
		{
			for (var i in style)
			{
				try
				{
					if (frame.document.styleSheets[0].insertRule) frame.document.styleSheets[0].insertRule(i + " {" + style[i] + "}", 0);
					else if (frame.document.styleSheets[0].addRule) frame.document.styleSheets[0].addRule(i, style[i]);
				}
				catch(e){}
			}
		}
	}
	
	this.enable = function(mode)
	{
		if (mode == undefined) mode = true;
		if (frame.document && frame.document.body)
		{
			frame.document.body.contentEditable = mode ? true : false;
			frame.document.designMode = mode ? 'on' : 'off';
		}
	}
	
	this.exec = function(command, data)
	{
		if (data == undefined) data = null;
		if (navigator.appName=='Netscape'){ // ага, значит Мозилка
			frame.document.execCommand("useCSS",false,true) // аргумент - третий в списке (true)!
		}
		if (command.toLowerCase() == 'inserthtml')
		{
			if (frame.document.selection && frame.document.selection.createRange)
			{
			    var range = frame.document.selection.createRange();
			    if (range.pasteHTML) range.pasteHTML(data);
			    return;
			}
		}
		frame.document.execCommand(command, false, data);
	}
	
	this.addEvent = function(event, handler)
	{
		//window.captureEvents(Event.KEYPRESS | Event.KEYDOWN | Event.KEYUP | Event.CLICK);
		//alert('event: '+handler);
		//frame.document['on'+event] = handler;
		if (frame.addEventListener)
		{
			/*frame.removeEventListener(event, handler, false);
			frame.addEventListener(event, handler, false);*/
			frame.document.removeEventListener(event, handler, false);
			frame.document.addEventListener(event, handler, false);
		}
		else if (frame.attachEvent)
		{
			/*frame.detachEvent("on"+event, handler);
			frame.attachEvent("on"+event, handler);*/
			frame.document.detachEvent("on"+event, handler);
			frame.document.attachEvent("on"+event, handler);
		}
	}
	
	this.onLoad = function(func)
	{
		onloadfunc = func;
	}
	
	this.doc = function()
	{
		return frame.document;
	}
	
	this.select = function()
	{
		var target = frame.document.body, rng, sel;
		if (frame.document.createRange)
		{
			rng = frame.document.createRange();
			rng.selectNode(target)
			sel = frame.getSelection();
			sel.removeAllRanges();
			sel.addRange(rng);
		}
		else
		{
			var rng = target.createTextRange();
			rng.moveToElementText(target);
			rng.select();
		}
	}
	
	this.focus = function()
	{
		frame.focus();//document.body.
	}
	
	if (conteiner)
	{
		conteiner.innerHTML = active ? html : text;
		frame = window[name+'_wysi'] ? window[name+'_wysi'] : document.getElementById(name+'_wysi').contentWindow;
		
		var loadfunc = function()
		{
			main.setStyles(style);
			main.enable(true);
			onloadfunc(frame);
		};
		
		frame.onload = loadfunc;
		
		loadfunc();
		setTimeout(loadfunc, 100);
		setTimeout(main.setStyles, 1000);
		setTimeout(main.setStyles, 3000);
		setTimeout(main.setStyles, 5000);
	}
}
