/* New document created: 6.2.2007 12:11:54 */

var wbvi = function(elm)
{

	var obj = {
		elm:{ a:lib.p(elm) },
		a:{ cursor:[], lineCount:0, pointer:{ target:null } },
		init: function()
		{
			with(obj)
			{
				a.value = elm.a.innerHTML;
				elm.a.innerHTML="";
				elm.frame = elm.a.make("iframe");
				
				setTimeout(doo.setTextarea,10);
				elm.lnum = elm.a.make("div",{ att:{ "class":"lnum" } });
				elm.lnumc = elm.lnum.make("div");
				
				elm.c = elm.a.make("div",{ att:{ "class":"content" }, on:{ mouseup:function(){ x.elm.b.focus(); }, mouseup:doo.setSel } });
				elm.p = elm.a.make("div",{ att:{ "class":"pointer" } });
				
				lib.p(document);
				lib.p(window);
				
				window.on("resize",doo.resize);
				
				doo.resize();
				
				for(var i=0; i<70; i++)doo.addLineNum();
			}
		},
		doo: {
			setTextarea: function()
			{
				with(obj)
				{
					elm.frameDocument = elm.frame.contentWindow.document;
					elm.frameContent = elm.frameDocument.body;
					elm.b = lib.p(elm.frameContent.appendChild(elm.frameDocument.createElement("textarea")));
					elm.b.on("keydown",doo.tab);
					elm.b.on("keyup",doo.print);
					elm.b.focus();
					elm.b.value = a.value;
					doo.print();
				}
			},
			setPointer: function(line,column)
			{
				with(obj)
				{
					elm.c.style.backgroundPosition = (column*7)+"px "+(line*12)+"px"
				}
			},
			initPointerFromDiv: function(fact)
			{
				with(obj)
				{
					var sel = doo.getSel()
					var line = elm.c.innerHTML.substring(0,sel[0]).split("\n").length-1;
					var col = doo.fixColumn(sel[0]);
					
					doo.setPointer(line,col);
				}
			},
			setSel: function(toDiv)
			{
				with(obj)
				{
					if(typeof toDiv=="number")
					{
						var sel = doo.getSel(1);
						var line = elm.b.value.substring(0,sel[1]).split("\n").length;
						doo.setPointer(line-1,doo.fixColumn(sel[0]));
						return;
					}
					var sel = doo.getSel()
					elm.b.setSelectionRange(sel[0],sel[1]);
					elm.b.focus();
					
					doo.initPointerFromDiv();
				}
			},
			getSel: function(fromTextarea)
			{
				with(obj)
				{
					if(typeof fromTextarea!="undefined")
						return [elm.b.selectionStart,elm.b.selectionEnd]
					var sel = window.getSelection().getRangeAt(0);
					return [sel.startOffset,sel.endOffset];
				}
			},
			fixColumn: function(selStart)
			{
				with(obj)
				{
					var l = 0;
					var data = elm.c.innerHTML.substring(0,selStart).split("\n");
					for(var i=0; i<data.length-1; i++)
						l+=data[i].length+1;
						
					column = selStart-l;
					
					data = data[data.length-1]
					count = 0;
					for(var i=0; i<data.length; i++)
						if(/\t/i.test(data[i]))count++;
					column+=(count*7)
					return column;
				}
			},
			print: function(fact)
			{
				with(obj)
				{
					elm.c.innerHTML = elm.b.value+"\n";
					doo.setSel(1);
					if(typeof fact!="undefined"&&fact.keyCode==13)doo.addLineNum();
					
					
				}
			},
			tab: function(fact){
			
				with(obj)
				{
					if(fact.keyCode==9){
						if(fact["stopPropagation"])fact["stopPropagation"]();
						if(fact["preventDefault"])fact["preventDefault"]();
						sel = doo.getSel(1);
						elm.b.value = elm.b.value.substring(0,sel[0])+"\t"+elm.b.value.substring(sel[0],sel[1]);
					}
					
				}
			
			},
			addLineNum: function()
			{
				with(obj)
				{
					a.lineCount+=1;
					elm.lnumc.innerHTML+="<div>"+a.lineCount+"</div>";
					
					if(a.screenHeight>elm.c.offsetHeight)return 1;
					elm.lnum.style.height = elm.c.offsetHeight+"px"
				}
			},
			resize: function()
			{
				with(obj)
				{
					a.screenWidth = document.body.offsetWidth;
					a.screenHeight = document.body.offsetHeight;
					elm.a.style.width = (a.screenWidth)+"px";
					elm.a.style.height = a.screenHeight+"px";
					
					elm.c.style.width = a.screenWidth-140+"px";
					
					elm.lnum.style.height = a.screenHeight-25+"px";
				}
			}
		}
	
	};
	obj.init();
	return obj;

}

window.onload = function()
{
	if(/Firefox/i.test(navigator.userAgent)==0)
		alert("Only Firefox, for now.");
	
	window.x = new wbvi(document.getElementById("tekst"));
}

