var ieObj;
var preventNext = false;
function onLoad(){
	//TODO: prevent default should be done for all browsers including special cases even if browser isn't compleatly supported.
	//TODO: check naming.
	var p = document.getElementById("textHolder")
	if (firefox){
		p.contentDocument.designMode="on";
		document.getElementById("TextFlow").style.position="absolute";
		p.contentDocument.addEventListener("keyup",keyUpHandler,false);
		p.contentDocument.addEventListener("keydown",keyDownHandler,false);
		p.contentDocument.addEventListener("blur",blurHandler,false);
		document.getElementById("TextFlow").addEventListener("focus",TextFlowFocus,false);
		if (firefox && !firefox2 && mac)
			window.addEventListener("DOMMouseScroll", wheelHandler, false);
		p.contentWindow.focus()
	}else if (safari){
		//We could add ff3 here to since it supports contenteditable as well
		p.style.display = "block";
		p.addEventListener("keyup",keyUpHandler,false);
		p.addEventListener("keydown",keyDownHandler,false);
		p.addEventListener("blur",blurHandler,false);
		window.addEventListener("mousewheel",wheelHandler,false);
	}else if (ie){
		//TODO: is this necessary for newer versions than ie6?
		//attachevent?
		p.style.display = "block";
		p.onkeyup = keyUpHandler;
		p.onkeydown = keyDownHandler;
		p.onblur = blurHandler;
		document.getElementById("TextFlow").onfocus = TextFlowFocus;
	}else{
		//Unsupported browser should never happen, but redirect just to make sure.
	}
	return true;
}
function blurHandler(event){
	if (!event)
		event = window.event;
	document.getElementById("TextFlow").focusLost();
	if (ie)
		window.onmousewheel = document.onmousewheel = null;
	else if (firefox2)
		window.removeEventListener("DOMMouseScroll", wheelHandler,false);
}
function TextFlowFocus(event){
	document.getElementById("TextFlow").focusGained();
}
function keyUpHandler(event){
// if (!event)
	// event = window.event;
// if (event.keyCode==86 && mac && firefox2&& event.metaKey)
	// sendText(event);
}
function keyDownHandler(event){
	if (!event)
		event = window.event;
	var oKeyEvent = new keyEvent();
	oKeyEvent.keyCode = event.keyCode; 
	oKeyEvent.shiftKey = event.shiftKey;
	oKeyEvent.ctrlKey = event.ctrlKey;
	if (mac)
		oKeyEvent.commandKey = event.metaKey;
	oKeyEvent.altKey = event.altKey;
	if(!ie)
		setTimeout(sendText, 5,oKeyEvent);
	else{
		ieObj = oKeyEvent
		setTimeout(function (){
					doSendText();
					},5);
	}
	if ((oKeyEvent.ctrlKey ||(mac && oKeyEvent.commandKey)) && (oKeyEvent.keyCode == 67 || oKeyEvent.keyCode == 88)){
		//TODO:Cleanup code
		var textArea;
		var text = document.getElementById("TextFlow").doCopy();
		if (text != ""){
			if (firefox){
				textArea = document.getElementById("textHolder");
				textArea.contentWindow.document.body.innerHTML = text
				
				setTimeout(textArea.contentWindow.document.execCommand('SelectAll', false, null), 2);
			}else if (ie || safari){
				textArea = document.getElementById("textHolder");
				textArea.innerHTML = text;
				
				setTimeout(document.execCommand('SelectAll', false, null) , 2);
			}else{
			//should not happen
			}
		}
	}
	if ((oKeyEvent.ctrlKey || (mac && oKeyEvent.commandKey ))&& !oKeyEvent.altKey){
		if(preventDefault(oKeyEvent.keyCode)){
			if (ie){
				event.keyCode=0;   
				event.returnvalue = false; 
			}else{
				event.preventDefault();
				event.stopPropagation();
			}
			return false;
		}
	}
	
}
function doSendText(){
	sendText(ieObj);
}
function wheelHandler(event){

	var delta=0;
	if(!event)
		event = window.event;
	if (event.wheelDelta) 
		delta = event.wheelDelta;
	else
		//signing differs between browsers for some reason. 
		delta = -event.detail;
	//TODO: fix firefox if neccessary
	
	offX = event.offsetX;
	offY = event.offsetY;
	if(ie || safari)
		delta /=40;
	document.getElementById("TextFlow").mouseWheeled(delta, offX, offY);

}
function preventDefault(keyCode){
	//TODO:add check if key combo needs to be prevented.
	switch (keyCode){
	case 65:
		//A
		return true;
	case 66:
		//B
		return true;
	case 67:
		//C
		return false;
	case 70:
		//F
		return true;
	case 73:
		//I
		return true;
	case 83:
		//S
		return true;
	case 85:
		//U
		return true;
	case 88:
		//X
		return false;
	case 89:
		//Y
		return true;
	case 90:
		//Z
		return true;
	default:
		return false;
	
	}
	
}
function sendText(oKeyEvent){
	if (preventNext){
		preventNext = false;
		return;
	}
	var textArea;
	if (firefox)
		textArea = document.getElementById("textHolder").contentDocument.body;
	else
		textArea = document.getElementById("textHolder")
	if (oKeyEvent.text == "" && textArea.innerHTML !="")
		oKeyEvent.text = textArea.innerHTML;
	document.getElementById("TextFlow").textReturn(oKeyEvent);
	textArea.innerHTML = ""
	if (safari){
		textArea.blur();
		TextFlowFocus();
		textArea.focus();
	}
	
}
function setFocus(){
	if (firefox2 && mac)
		preventNext=true;
	var textArea;
	if (firefox)
		textArea = document.getElementById("textHolder").contentWindow;
	else
		textArea = document.getElementById("textHolder");
	
	if (ie)
		window.onmousewheel = document.onmousewheel = wheelHandler;
	else if (firefox2)
		window.addEventListener("DOMMouseScroll", wheelHandler, false);
	textArea.focus();
		if (firefox && mac){
		setTimeout(textArea.focus(), 1);
	}
}
function keyEvent(){
	this.text=""
	this.keyCode=0;
	this.ctrlKey=false;
	this.shiftKey=false;
	this.commandKey=false;
	this.altKey=false;
}

