		
var RBEditor = function(){
			
		}
		
		
		RBEditor.prototype = {
			h : "<html><head><title>piu</title><link rel='stylesheet' type='text/css' href='/media/css/editor2.css' /></head><body> </body></html>",
			w : "",
			CODE:0,
			WYSIWYG:1, 
			visualMode:1,
			id:"rbeditor",
			buttons: [
						{name:"B",  cmd:"bold",                key:'b',  title:"Жирный"},
						{name:"I",  cmd:"italic",              key:'i',  title:"Курсив"},
						{name:"U",  cmd:"underline",           key:'u',  title:"Подчеркнутый"},
						{name:"S",  cmd:"StrikeThrough",       key:'0',  title:"Зачеркнутый"},
						{name:"BLOCKQUOTE", cmd:"blockquote",  key:'',   title:"Цитировать"},
						{name:"UL", cmd:"insertunorderedlist", key:'',   title:"Маркированный список"},
						{name:"OL", cmd:"insertorderedlist",   key:'',   title:"Упорядоченный список"},
						{name:"H1", cmd:"h1",                  key:'',   title:"Заголовок"},
						{name:"H2", cmd:"h2",                  key:'',   title:"Подзаголовок"},
						{name:"CENTER",  cmd:"center",         key:'',   title:"Выравнивания по центру"},
						{name:"A",  cmd:"link",                key:'',   title:"Гиперссылка"},
						   {name:"UN", cmd:"undo",                key:'',   title:"Отменить"},
						{name:"RE", cmd:"redo",                key:'',   title:"Вернуть"},
						{name:"IMG",cmd:"img",                 key:'',   title:"Изображение"},
						/*{name:"AU", cmd:"audio",               key:'',   title:"Видеозаписи"},*/
						{name:"VI", cmd:"video",               key:'',   title:"Видеозаписи"}
					 
					 ],
					 
			init : function (oid){
				var t = this, obj = $("#"+oid)[0];
				t.isGecko   = navigator.userAgent.toLowerCase().indexOf("gecko") != -1;
				t.editor    = document.createElement("iframe");
				t.editor.frameBorder = 0;
				t.editor.id = t.id;
				t.tarea = obj;
				$(t.tarea).hide();
				t.prnt = obj.parentNode;
				t.prnt.insertBefore(t.editor, obj);
				t.box = new MessageBox({
					  title: "Системное сообщение",
					  width: "410px",
						  height: "auto",
					  closeButton:true
				});
				if (!t.isGecko) {
					t.win = frames[t.id].window;
					t.doc = frames[t.id].document;
				}else{
					t.win = t.editor.contentWindow;
					t.doc = t.editor.contentDocument;
				}
				t.doc.open();
				t.doc.write(t.h);
				t.doc.close();
				t.doc.body.innerHTML = obj.value;
				t.addControl();
				t.doc.designMode = "on";
				t.setEditStyle();
				var evs = [	'keydown', 'keypress', 'mousedown', 'mouseup', 'drag'];
				for(var i in evs){
					$(t.doc).bind(evs[i], function(event){return function(){t.editorEvent(event, arguments)}}(evs[i]));
				}
				
				
				
				return this;
			},
			
			addControl: function(){
				var t = this, isimg, c = document.createElement("div");
				c.id = "controlLayout";
				t.prnt.insertBefore(c, t.editor);
				for(var i in t.buttons){
					var a = document.createElement("a");
					a.setAttribute("href", "javascript:;");
					a.setAttribute("title", t.buttons[i].title);
					a.className = t.buttons[i].name;
					if (a.className == "IMG") {
						a.id = "img_upload";
						isimg = true;
					}
					$(a).bind('click', function(cmd, _t){return function(){t.execCommand(cmd, _t);}}(t.buttons[i].cmd, t));  
					c.appendChild(a);
					t.buttons[i].obj = a;
				}
				if (isimg) {
					new AjaxUpload('img_upload', {
						action: '/streams/upload2/',
						name: 'icon',
						onComplete: function(file, data){
							t.images.get(t).insert(data, data);
						}
					});
				}
			},
			
			setEditStyle: function(){
				var	t = this; 
				if($.browser.msie){
					t.doc.execCommand("LiveResize", false, false);
				} else {
					t.doc.execCommand("styleWithCSS", false, false);
					t.doc.execCommand('enableObjectResizing', null, false);
    				t.doc.execCommand('enableInlineTableEditing', null, false);
				}
			},
			
			editorEvent: function (event, args){
				var t = this;
				t.updateControl();
			},
			
			updateControl: function (){
				var t = this;
				for(var i in t.buttons){
					var val = (t.buttons[i].key!="") ? t.doc.queryCommandState(t.buttons[i].cmd): t.parent(t.buttons[i].name.toLowerCase(), t.rangeContainer());
					t.buttons[i].obj.className = t.buttons[i].name + ((val)? " active":" ");
				}
			},
			
			execCommand: function(cmd, obj){
				var t = obj;
				try{
					switch(cmd){
						case "toggle": t.toggleMode(); return;
						case "tt": 
						case "center": 
							  t.insertCustomTag(cmd);  break;
						case "blockquote": 
									//t.insertCustomTag(cmd);  break;
									t.doc.execCommand("formatBlock", false, "<h4>"); break;
						case "h1":
						case "h2":
						case "h3": t.doc.execCommand("formatBlock", false, "<"+cmd+">"); break;
						case "hr": t.insertHTML("<hr />");  break;
						case "table": t.tablePrepare();  break;
						case "link":  t.linkPrepare();   break;
						case "hider": t.hiderPrepare();  break;
						case "audio": t.audio.get(t);  break;
						case "video": t.video.get(t);  break;
						case "img":  /* t.images.get(t); */ break;
						default: 
								t.doc.execCommand(cmd, false, false); 
								break;
					}
					t.updateControl();
					(($.browser.mozilla)?t.win:t.doc.body).focus();
				} catch(e){
					alert(e);
				}
			},
			
			toggleMode: function(){
				var t = this;
				t.visualMode = !t.visualMode;
				if(t.visualMode == t.WIKI){
					t.h = t.doc.body.innerHTML;
					t.w = t.html2wiki(t.h);
					t.tarea.value = t.w;
					show(t.tarea);
					hide(t.editor);
				}else{
					t.w = t.tarea.value;
					t.h = t.wiki2html(t.w);
					t.doc.body.innerHTML = t.h;
					show(t.editor);
					hide(t.tarea);
					t.setEditStyle();
				}
			},
			
			insertCustomTag: function(tag){
				var t = this, r = t.range();
				if(!t.parent(tag, t.rangeContainer())){
					if($.browser.msie){
						var s = "<"+tag+">"+r.text + "</"+tag+">";
						r.pasteHTML(s);
					}else{
						var s = "<"+tag+">"+r.toString() + "</"+tag+">";
						t.doc.execCommand('insertHTML', false, s);
					}
				}else{
					if($.browser.msie){
						var s = "</"+tag+">"+r.text + "<"+tag+">";
						r.pasteHTML(s);
					}else{
						var s = "</"+tag+">"+r.toString() + "<"+tag+">";
						t.doc.execCommand('insertHTML', false, s);
					}
				}
			},
			
			insertHTML: function(h){
				var t = this;
					 (($.browser.mozilla)?t.win:t.doc.body).focus();
					if($.browser.msie){
						var r = t.range();
						r.pasteHTML(h);
					}else{
						t.doc.execCommand('insertHTML', false, h);
					}
			},
			
			
			/*
			 *Table
			 */
			tablePrepare: function() {
				var t = this;
				var c =  '<div class="inputLayout">Заголовок: <input type="text" class="inputText" id="tableCaption" /></div>';
					c += '<div class="inputLayout">Количество строк: <input type="text" class="inputText" id="tableRows"/></div>';
     				c += '<div class="inputLayout">Количество столбцов:<input type="text" class="inputText" id="tableColumns"  /></div>';
				t.box.setOptions({
					title:"Новая таблица",
					hideOnClick: false,
					width:"400px",
					height:"auto",
					bodyStyle:"padding:10px"
				}); 
				t.box.removeButtons();
				t.box.addButton({onClick:function(){}, label:'Отмена'})
					.addButton({onClick:function(){
							t.table(ge("tableColumns").value, ge("tableRows").value, ge("tableCaption").value);
							;
						}, label:'Ок'})
					.content(c)
					.show();
			},
			
			table: function(clmns, rws, caption) {
				var t = this, tbl = "<table>", line = '';
				tbl += "<caption>"+caption+"</caption><tbody>";
				while(clmns --){
					line+= "<td>&nbsp;</td>";
				}			
				while(rws--){
					tbl += "<tr>"+line+"</tr>";
				}
				tbl += "</tbody></table>";
				t.insertHTML(tbl);
			},
			
			

			/*
			 *Link
			 */
			linkPrepare: function() {
				var t = this,  r = t.range();
				var c =  '<div class="inputLayout">URL: <input type="text" class="inputText" id="someInput" /></div>';
				t.box.setOptions({
					title:"Ссылка",
					width:"250px"
				}); 
				t.box.addButton({label:'Отмена'}, function(){
					
				})
					.addButton({label:'Ок'}, function(){
							t.link($("#someInput").val(), r);
						
						})
					.content(c)
					.show();
			},
			
			link: function (url, r) {
				var t = this;
				if ($.browser.msie)r.select();
				var t = this;
				if ($.browser.msie)r.select();
				re = /rockbaby/i;
				if(re.test(url))
				var s = "<a href='"+url+"'>"+(($.browser.msie)?r.text:r.toString()) + "</a>";
				else
				var s = "<a target='_blank' href='"+url+"'>"+(($.browser.msie)?r.text:r.toString()) + "</a>";
				t.insertHTML(s);
			},
			
			
			/*
			 *Hider
			 */
			hiderPrepare: function() {
				var t = this,  r = t.range();
				var c =  '<div class="inputLayout">Заголовок: <input type="text" class="inputText" id="someInput" /></div>';
				t.box.setOptions({
					title:"Спойлер",
					hideOnClick: false,
					width:"280px",
					height:"auto",
					bodyStyle:"padding:10px"
				}); 
				t.box.removeButtons();
				t.box.addButton({onClick:function(){t.box.hide()}, label:'Отмена'})
					.addButton({onClick:function(){
							t.hider(ge("someInput").value, r);
							t.box.hide();
						}, label:'Ок'})
					.content(c)
					.show();
			},
			
			hider: function (spoiler, r) {
				var t = this;
				if (browser.msie)r.select();
				var str =((browser.msie)?r.text:r.toString());
				if (str=""){
					str="<br/>"
				}
				var s = "<div class='hider'><div class='spoiler'>"+spoiler+"</div>"+str+"&nbsp;</div>";
				t.insertHTML(s);
			},
			
			audio: {
				
				get:function(t){
					this._t = t;
					t.API.request("audio.get", "VkEditor.audio.show", {"uid":t.API.user_id});
				},
				
				show:function(data){
					var t = this._t;
					var tracks = data['response'], c = "";
					t.box.setOptions({
						closeButton: true,
						title:"Выберите аудиозапись",
						hideOnClick: false,
						width:"510px",
						height:"535px",
						height:"auto",
						bodyStyle:"padding:0px"
						
					});
					c += "<div class='top-panel-audio'>";
						c += "<input id='audiosearch' placeholder='Поиск по аудиозаписям' class='inputText inputSearch' />";
					c += "</div>";
					c += "<div id='audios'>";
					c += this.list(tracks);
					c+="</div>";
					t.box.removeButtons()
					 	 .content(c)
					   	 .addButton({onClick:function(){t.box.hide()}, label:'Закрыть'})
					     .show();
					each(tracks, function(k,v){
				  		t.addEvent(ge("audio4wiki" + v.aid), "click", function (){
							t.audio.insert(v.aid);
						});
				    });
					t.addEvent( ge("audiosearch"), "keypress", function(e){t.audio.search(e)});
					placeholderSetup("audiosearch");
				},
				
				list: function(tracks){
					var c = "";
					c+= "<div class='info-panel'>Всего показано "+tracks.length+" записей:</div>";
					for (var i in tracks){
						var min = intval(tracks[i].duration/60);
						var sec = tracks[i].duration - min*60;
						c += "<div id='audio"+tracks[i].aid+"' class='audioRow'>"
							+"<table>"
							+"<tr>"
							+"<td><img src='images/play.gif' nosorthandle='true' id='imgbutton"+tracks[i].aid+"' onclick=\"return operate('"+tracks[i].aid+"','"+tracks[i].url+"', "+tracks[i].duration+");\" class='playimg' /></td>"
							+"<td>"
							+"<div class='audioTitle'><b id='performer"+tracks[i].aid+"'>"+tracks[i].artist+"</b><span> - </span><span id='title"+tracks[i].aid+"'>"+tracks[i].title+"</span></div>"
							+"<div class='duration''>"+min+":"+((sec<10)?("0"+sec):(sec))+"</div>"
							+"</td>"
							+"<td>"
							+"<a href='javascript:;' id='audio4wiki"+tracks[i].aid+"' class='choose_audio_send_wiki'>Выбрать</a>"
							+"</td>"
							+"</tr>"
							+"<tr>"
							+"<td colspan='3'>"
								+'<div style="height: 14px; margin-left: 28px;">'
								+'<div id="line'+tracks[i].aid+'" class="playline"></div>'
								+'<div id="toddler'+tracks[i].aid+'" class="toddler"></div>'
								+'<div id="player'+tracks[i].aid+'" style="display: none;" class="playerClass"></div>'
							+"</div>"
							+"</td>"
							+"</tr>"
							+"</table>"
							+"</div>";
					}
					return c;
				},
				
			
				search:function(e){
					if((e.charCode ? e.charCode : e.keyCode) == 13) 
						this._t.API.request("audio.search", "VkEditor.audio.searchRes", {"q":ge("audiosearch").value});
				},
				
				searchRes:function(data){
				  var tracks = data['response'], t = this._t;
				  tracks.shift();
				  ge("audios").innerHTML = this.list(tracks);
				  each(tracks, function(k,v){
				  	t.addEvent(ge("audio4wiki" + v.aid), "click", function (){
						t.audio.insert(v.aid);
					});
				  });
				},
				
				insert: function(id){
					var t = this._t
					t.insertHTML("<div id='audiorecord" + id + "' class='audiorecord'>&nbsp;</div>&nbsp;");
					t.box.hide();
				}
			},
			
			images: {
				get:function(t){
					this._t = t;
					return this;
					//t.API.request("photos.getAlbums", "VkEditor.images.showAlbums");
				},
				
				
				insert: function(small, big){
					var t = this._t
					t.insertHTML("<img id='insertedImage' src='/" + small + "'/>");
					$(t.doc.body).children("#insertedImage").dblclick( function(){
						t.images.edit(this);
					});
				},
				
				edit: function (obj){
					var t = this._t;
					t.box.setOptions({
						closeButton: true,
						title:"Редактирование параметров изображения",
						hideOnClick: false,
						width:"300px",
						height:"auto",
						bodyStyle:"padding:10px"
					});
					var c = "<center><img src='"+obj.src+"' /></center><br />";
					c +=  '<div class="inputLayout">Название: <input type="text" class="inputText" id="tableCaption" /></div>';
					c += '<div class="inputLayout">Высота: <input type="text" value="'+obj.height+'" class="inputText" id="tableRows"/></div>';
     				c += '<div class="inputLayout">Ширина: <input type="text" value="'+obj.width+'" class="inputText" id="tableColumns"  /></div>';
					t.box.content(c);
					t.box.addButton({label:"Ок"}, function(){
						t.box.hide();
					});
					t.box.addButton({label:"Отмена"}, function(){
						t.box.hide();
					});
					t.box.show();
				}
				
			},
			
			
			video: {
				storage: Array(),
				query:"",
				get:function(t){
					this._t = t;
					t.box.setOptions({
  						  title: "Вставка видео",
  						  width: "410px",
   						  height: "auto",
						  closeButton:true
					});
					var c = "<input id='videosearch' value='Поиск по видеозаписям на youtube' onclick='this.value=\"\"' class='inputText inputSearch' />";
					c +="<div id='videos'></div>";
					c += "<div id='insertCode'>Или вставьте код проигрывателя:<br/>";
					c += "<textarea id='embedArea'></textarea></div>";
					t.box.content(c);
					t.box.addButton({label:'Вставить код'}, function(){
						//var id = t.video.storage.push($("#embedArea").val());
					//	t.insertHTML('<span class="embed-video" id="video_'+id+'"></span>');
						t.insertHTML($("#embedArea").val());
						
					})
					t.box.show();
					$("#videosearch").keypress(function(e){
						if((e.charCode ? e.charCode : e.keyCode) == 13) {
							var v = $('#videoContainer');
							if(v){
							  v.remove();
							}
							query = $("#videosearch").val();
							t.youtubeAPI.search(query, "streams.editor.video.show");
						}
					})
				},
				
				show :function(data){
					var t = this._t, c ="", videos = data['feed']['entry'];
					$(".buttons-layout, #insertCode").hide();
					for(var i in videos){
						var id = videos[i].id.$t.replace("http://gdata.youtube.com/feeds/api/videos/", "");
						c +="<div id='"+id+"' ><img src='" + videos[i].media$group.media$thumbnail[0].url + "'/></div>";
					}
					$("#videos").html(c);
					$("#videos").show();
					$("#videos div").click(function(){
						var c = '<object width="394" height="313"><param name="movie" value="http://www.youtube.com/v/'+this.id+'"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/'+this.id+'" type="application/x-shockwave-flash" width="394" height="313" allowscriptaccess="always" allowfullscreen="true"></embed></object>';
						c += '<div class="ctrl">';
						c += '<a id="chooseVideo" href="javascript:;">Выбрать</a>';
						c += ' <a href="javascript:;" onclick="$(\'#videoContainer\').remove();$(\'#videos\').show();">Назад к списку видео</a>';
						c += '</div>';
						$("#videos").parent().append("<div id='videoContainer'>"+c+"</div>");
						$("#videos").hide();
						var v = '<object width="630" height="380"><param name="movie" value="http://www.youtube.com/v/'+this.id+'"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/'+this.id+'" type="application/x-shockwave-flash" width="630" height="380" allowscriptaccess="always" allowfullscreen="true"></embed></object>';
						
						$("#chooseVideo").click(function(){
							//var id = t.video.storage.push(v);
							//t.insertHTML('<span class="embed-video" id="video_'+id+'"></span>');
							t.insertHTML(v);
							t.box.hide();
						});
					});
				},
				
				insert: function(link, title){
					var t = this._t;
					t.insertHTML('<a href="/'+link+'">'+title+'</a>');
					t.box.hide()
				},
				
				insertFromAddress: function(){
					var link = ge("insertvideo").value;
					var t = this._t;
					t.insertHTML('<a href="/'+link+'">'+link+'</a>');
					t.box.hide()
				}
			},
			
			val: function(h){
				var t = this;
				
				if (!h) {
					h = t.doc.body.innerHTML
				/*	for(var i in t.video.storage){
						j = parseInt(i) + parseInt(1);
						var pattern = '(<span[^>]*id\="video_'+j+'">.*<\/span>?)';
						var reg = new RegExp(pattern);
						h = h.replace(reg, t.video.storage[i]);
					}*/
					return h;
				} else{
					t.doc.body.innerHTML = h;
				}
			},
			
			html2wiki: function(str){
					str = str.replace(/<em>/gi, "<i>")
							 .replace(/<\/em>/gi, "</i>")
							 
							 .replace(/<strong>/gi, "<b>")
							 .replace(/<\/strong>/gi, "</b>")
					
						 	 .replace(/<br>/gi, "\n")
							 .replace(/<br\/>/gi, "\n")
					
							//.replace(/<.*p>/gi, "")
					
						 	 .replace(/<U>/g, "<u>")
							 .replace(/<\/U>/g, "</u>")
				return str;
			},
			
			wiki2html: function(str){
				str = str.replace(/\n/gi, "<br/>");
				return str;
			},
			
			range: function(){
				var t = this;
				return (!$.browser.msie)?t.win.getSelection().getRangeAt(0):t.doc.selection.createRange();
			},
			
			rangeContainer: function(){
				var t = this;
				return (!$.browser.msie) ? t.range().commonAncestorContainer : t.range().parentElement();
			},
			
			parent: function(tag, el){
				while(el && (!el.tagName || el.tagName.toLowerCase()!="body") ){
					if(el.tagName && el.tagName.toLowerCase()==tag){return el;}
					el = el.parentNode;
				}
				return null;
			},
			
			youtubeAPI:{
				search:function(query, callback){
					var search_link = "http://gdata.youtube.com/feeds/api/videos?alt=json-in-script&max-results=50&vq=";
					$.getScript(search_link+query+"&callback="+callback);
				}
			}
			
			
		}
/*
	var RbEditor1 = new RbEditor;
	RbEditor1.buttons = [
						{name:"B",  cmd:"bold",                key:'b',  title:"Жирный"},
						{name:"I",  cmd:"italic",              key:'i',  title:"Курсив"},
						{name:"U",  cmd:"underline",           key:'u',  title:"Подчеркнутый"},
						{name:"S",  cmd:"StrikeThrough",       key:'0',  title:"Зачеркнутый"},
						{name:"UL", cmd:"insertunorderedlist", key:'',   title:"Маркированный список"},
						{name:"OL", cmd:"insertorderedlist",   key:'',   title:"Упорядоченный список"},
						{name:"H1", cmd:"h1",                  key:'',   title:"Заголовок"},
						{name:"H2", cmd:"h2",                  key:'',   title:"Подзаголовок"},
						{name:"A",  cmd:"link",                key:'',   title:"Гиперссылка"}
					 ]; 
	
	*/