var identifiers=['bold','italic','underline','strikethrough','superscript','subscript','justifyleft','justifycenter','justifyright','justifyfull']; //,'insertparagraph','indent','outdent'];


var allowed={justifyleft:true,justifycenter:true,justifyright:true,justifyfull:true,indent:true,outdent:true,p:true}
var undoDelete=false
var selectedProtect=null;
var queryTimer=null;
var textTreeWalker={}
var currentControl=null;
var editBlockformatSelect={}
var hasOwnFormatNames=false;
var editSection={simple:'infoWindowSimple',tabbed:'infoWindowTabbed',overlay:'overlay'}

function editorSetup()
{
	var element;
	var name;
	if(document.selection)
	{
		var range=document.selection.createRange()
		for(var x in blockFormats)
		{
			element=document.getElementById(x)
			range.moveToElementText(element)
			range.select();
			name=document.queryCommandValue('formatblock')	
			if(name)
			{
				blockFormats[x]=name
				hasOwnFormatNames=true;
			}
		}
	}
	else if(document.createRange)
	{
		var range=document.createRange()
		var selection=window.getSelection()
		for(var x in blockFormats)
		{
			element=document.getElementById(x)
			selection.removeAllRanges()
			range.selectNodeContents(element)
			selection.addRange(range)
			name=''
			try{
			name=document.queryCommandValue('formatblock')	
			}catch(e){}
			if(name)
			{
				blockFormats[x]=name
				hasOwnFormatNames=true;
			}
		}
	}
}

function editPutBlockformats(type)
{
	var x;
	//GLog.write(type)
	if(!editBlockformatSelect[type])
	{
		editBlockformatSelect[type]=new SelectBox('blockformat_'+type,editSection[type],new Function('option','editSetBlockFormat(option.value,\''+type+'\')'));
		var options=[];
		for(x in blockFormats)
		{
			options.push({text:blockFormats[x],value:((hasOwnFormatNames)?blockFormats[x]:x)})
		}
		editBlockformatSelect[type].setOptions(options);
	}
	editBlockformatSelect[type].draw();
}


	function editTextFilter(node)
	{
		if(node.nodeType==document.TEXT_NODE)return NodeFilter.FILTER_ACCEPT
		else return NodeFilter.FILTER_ACCEPT
	}

	function editRemoveEvents(doc,type)
	{
		if(doc.removeEventListener)
		{	
			doc.removeEventListener("keypress",new Function('event','editKeyPress(event,\''+type+'\')'),false);
			doc.removeEventListener("click",new Function('event','editClick(event,\''+type+'\')'),false);
		}
		else if(doc.detachEvent)
		{
			doc.detachEvent("onkeydown",new Function('event','editKeyDown(event,\''+type+'\')'));
			doc.detachEvent("onclick",new Function('event','editClick(event,\''+type+'\')'));
		}
		else
		{
			alert('not supported');
		}
	}

	
	
	function editSetEvents(doc,type)
	{
		if(doc.addEventListener)
		{	
			doc.addEventListener("keypress",new Function('event','editKeyPress(event,\''+type+'\')'),false);
			doc.addEventListener("click",new Function('event','editClick(event,\''+type+'\')'),false);
		}
		else if(doc.attachEvent)
		{
			doc.attachEvent("onkeydown",new Function('event','editKeyDown(event,\''+type+'\')'));
			doc.attachEvent("onclick",new Function('event','editClick(event,\''+type+'\')'));
		}
		else
		{
			alert('not supported');
		}
	}
	
	function editControlSelect(type)
	{
		var event=editWin[type].event
		editSetCurrentControl(event.srcElement,type)
	}

	function editKeyDown(event,type)
	{
		if(!event)event=editWin[type].event;
		switch(event.keyCode)
		{
			case 8:
			if(editCheckAfterProtected(type) )//|| editCheckBeforeProtected()
			{
				//if(event.preventDefault)event.preventDefault();
				event.returnValue=false;
			}
			//else undoDelete=true;	
			break;
			case 46:
			if( editCheckBeforeProtected(type))//checkAfterProtected() ||
			{
				//if(event.preventDefault)event.preventDefault();
				event.returnValue=false;
			}
			//else undoDelete=true;	
			break;
			case 33:
			case 34:
			case 35:
			case 36:
			case 37:
			case 38:
			case 39:
			case 40:
			break;
			default:
			if(editCheckProtected(type))
			{
				event.returnValue=false;
			}
			break;
		}
		editDoButtons(type)
	}

	function editKeyPress(event,type)
	{
		if(!event)event=editWin[type].event
		switch(event.keyCode)
		{
			case 8:
				if(editCheckAfterProtected(type))//|| editCheckBeforeProtected()
				{
					event.preventDefault();
					//if(event.preventDefault)event.preventDefault();
					//return false;
				}
				//else undoDelete=true;	
			break;
			case 46:
				if(editCheckBeforeProtected(type))//editCheckAfterProtected() ||
				{
					event.preventDefault();
					//if(event.preventDefault)event.preventDefault();
					//return false;
				}
				//else undoDelete=true;	
			break;
			case 33:
			case 34:
			case 35:
			case 36:
			case 37:
			case 38:
			case 39:
			case 40:
			break;
			
			default:
			if(editCheckProtected(type))
			{
				event.preventDefault();
			}
			break;
		}
		editDoButtons(type)
	}

	
	function editSelectProtect(obj,type)
	{
		if(selectedProtect)selectedProtect.style.backgroundImage='';
		if(obj)
		{
			obj.style.backgroundImage='url(gfx/protect.gif)';
			selectedProtect=obj	
		}
		else
		{
			selectedProtect=null;	
		}
	}
	
	
	function editFindControl(control,type)
	{
			if(!control)alert('no control!!!!')
			switch(control.tagName)
			{
				case 'TABLE':
				case 'IMG':
					editSetCurrentControl(control,type)
					return;
				break;
				case 'BODY':
				break;
				default:
					if(control.parentNode)editFindControl(control.parentNode,type)
					//else alert('no parent Marker')
				break;
			}
	}
	function editClick(event,type)
	{
		if(!event)event=editWin[type].event
		var control;
		if(control=event.target);
		else if(control=event.srcElement);
		editFindControl(control,type)
		editDoButtons(type)
	}

	function editExecCommand(style,type)
	{
		if(allowed[style] || !editCheckProtected(type))
		{
			editDoc[type].execCommand(style,false,null)
		}
		editQueryStates(type);
		editWin[type].focus();
	}

	function editSetBlockFormat(format,type)
	{
		if(allowed[format] || !editCheckProtected(type))
		{
			editDoc[type].execCommand('formatblock',false,format)
		}
		editQueryStates(type);
		editWin[type].focus();
	}
	
	function editDoButtons(type)
	{
		if(queryTimer)clearTimeout(queryTimer);
		queryTimer=setTimeout('editQueryStates(\''+type+'\')',200);
	}


	function editQueryStates(type)
	{
		
		queryTimer=null;
		var id;
		//editWin.focus();
		
		if(undoDelete && editCheckProtected(type))editDoc[type].execCommand('undo',false,null)
		undoDelete=false;
		editSelectProtect(editCheckProtected(type),type)
		
		
		for(var x=0;x<identifiers.length;x++)
		{
			id=identifiers[x];
			try
			{
				document.getElementById(id+'_'+type).className='imgButton'+((editDoc[type].queryCommandState(id))?'Select':'');			
			}
			catch(e)
			{
				GLog.write(id+' '+e.message)
			}
		}
		
		try
		{
			var blockformat=editDoc[type].queryCommandValue('formatblock');
		}
		catch(e)
		{
			GLog.write('formatblock '+e.message)
		}
		blockformat=((blockformat)?blockformat:'normal');
		if(document.all)
		{
			document.getElementById('insertorderedlist_'+type).className='imgButton'+((blockformat==blockFormats['ol'])?'Select':'');
			document.getElementById('insertunorderedlist_'+type).className='imgButton'+((blockformat==blockFormats['ul'])?'Select':'');
		}
		
		editBlockformatSelect[type].selectValue(blockformat)
		setEditHTML(type)
		//setTimeout('setEditHTML(\''+type+'\')',0)
	}

	function editCheckBeforeProtected(type)
	{
		var tmp=null;
		var range=null;
		var parent=null;
		var helperNode=null;
		if(tmp=editWin[type].getSelection)
		{
			var selection=tmp();
			var focus=selection.focusNode;
			var focusOffset=selection.focusOffset;
			var range=editDoc[type].createRange()
			if(focus.nodeType==document.ELEMENT_NODE)
			{
				var x;
				if(focus.tagName=='BODY')
				{
					parent=editDoc[type].body.childNodes[focusOffset];
				}
				else
				{
					range.selectNode(focus)
					textTreeWalker[type].currentNode=focus;
					do{
						parent=textTreeWalker[type].nextNode()
					}
					while(range.compareNode(parent)==range.node_INSIDE)
				}
			}
			else if(focusOffset==focus.nodeValue.length && focus.nodeType==document.TEXT_NODE)
			{
				
					range.selectNode(focus)
					textTreeWalker[type].currentNode=focus;
					do{
						parent=textTreeWalker[type].nextNode()
					}
					while(range.compareNode(parent)==range.node_INSIDE)
			}
			else 
			{
				range.setEnd(focus,focusOffset+1);
				parent=range.endContainer;
			}
		}
		else if(tmp=editDoc[type].selection)
		{
			switch(tmp.type)
			{
				case 'None':
				case 'Text':
					range=tmp.createRange()
					range.moveEnd('character',1);
					range.collapse(false);
					parent=range.parentElement()
				break;
				case 'Control':
					parent=tmp.createRange().item(0);
				break;
			}
		}
		else alert('not supported');
		return editFindParentClassName(parent,'protect');
	}
	
	function editCheckProtected(type)
	{
		var tmp=null;
		var parent=null;
		if(tmp=editWin[type].getSelection)
		{
			parent=tmp().anchorNode//.parentNode;
		}
		else if(tmp=editDoc[type].selection)
		{
			switch(tmp.type)
			{
				case 'None':
				case 'Text':
					parent=tmp.createRange().parentElement();
				break;
				case 'Control':
					parent=tmp.createRange().item(0);
				break;
			}
			
		}
		else alert('not supported');
		return editFindParentClassName(parent,'protect',type);
	}

	function editCheckAfterProtected(type)
	{
		var tmp=null;
		var parent=null;
		var range=null;
		
		if(tmp=editWin[type].getSelection)
		{
			var selection=tmp();
			var anchor=selection.anchorNode;
			var anchorOffset=selection.anchorOffset;
			range=editDoc[type].createRange();
			if(anchor.nodeType==document.ELEMENT_NODE)
			{
				if(anchor.tagName=='BODY')
				{
					if(anchorOffset)
					{
						parent=editDoc[type].body.childNodes[anchorOffset-1];
					}
				}
				else
				{
					range.selectNode(anchor)
					textTreeWalker[type].currentNode=anchor;
					do{
						parent=textTreeWalker[type].previousNode()
					}
					while(range.compareNode(parent)==range.node_INSIDE)
				}
			}
			else if(anchor.nodeType==document.TEXT_NODE && anchorOffset==0)
			{
				
				range.selectNode(anchor)
				textTreeWalker[type].currentNode=anchor;
				do{
					parent=textTreeWalker[type].previousNode()
				}
				while(range.compareNode(parent)==range.node_INSIDE)
			}
			else
			{
				range.setStart(anchor,anchorOffset-1);
				parent=range.startContainer;
			}
			
			
		}
		else if(tmp=editDoc[type].selection)
		{
			switch(tmp.type)
			{
				case 'None':
				case 'Text':
					range=tmp.createRange()
					range.moveStart('character',-1);
					range.collapse(true);
					parent=range.parentElement()
				break;
				case 'Control':
					parent=tmp.createRange().item(0);
				break;
			}
			
		}
		else alert('not supported');
		return editFindParentClassName(parent,'protect',type);
	}

	function editFindParentClassName(node,className,type)
	{
		while(node && node.tagName!='BODY' && node.tagName!='HTML')
		{
			if(node.className==className)return node;
			node=node.parentNode
		}
		return false;
	}

	function editSetCurrentControl(control,type)
	{
		var tmp;
		if(currentControl)
		{
			if(tmp=currentControl.detachEvent)
			{
				tmp("onresize",new Function('event','editControlResize(event,\''+type+'\')'),true);
			}
			//else if(tmp=currentControl.removeEventListener)
			//{
			//	tmp("resize",editControlResize,true);
			//	tmp("change",editControlResize,true);
			//}
		}
		currentControl=control
		if(tmp=currentControl.attachEvent)
		{
			tmp("onresize",new Function('event','editControlResize(event,\''+type+'\')'));
		}
		//else if(tmp=currentControl.addEventListener)
		//{
		//	tmp("resize",editControlResize,true);
		//	tmp("change",editControlResize,true);
		//}
	}

	
	function editInsertBreak(type)
	{
		var tmp=null;
		
		var protect=editCheckProtected(type)
		var protectBefore=editCheckBeforeProtected(type)
		var protectAfter=editCheckAfterProtected(type)
		if(!((protectBefore && protect && protectAfter  )
		&&(protect===protectBefore)
		&&(protect===protectAfter)))
		{
			var element=editDoc[type].createElement('br')
			if(protect && protectBefore && protect==protectBefore)
			{
				protect.parentNode.insertBefore(element,protect)
			}
			else if(protect && protectAfter && protect==protectAfter)
			{
				if(protect.nextSibling)
				{
					protect.parentNode.insertBefore(element,protect.nextSibling)
				}
				else if (protect.parentNode)
				{
					var parent=protect.parentNode
					parent.innerHTML+='<BR>'
					if(tmp=editWin[type].getSelection)
					{
						var selection=tmp();
						var range=selection.getRangeAt(0)
						range.selectNode(parent)
						range.collapse(false)
					}
				}
			}
			else if(protect && protectAfter && protect!==protectAfter)
			{
				protectAfter.parentNode.insertBefore(element,protectAfter)
			}
			else
			{
				if(tmp=editWin[type].getSelection)
				{
					var selection=tmp();
					var range=selection.getRangeAt(0)
					range.surroundContents(element)
					range.collapse(false)
				}
				else if(tmp=editDoc[type].selection)
				{
					var range=tmp.createRange()
					range.collapse(false)
					range.pasteHTML('<BR>')
					range.collapse(false)
				}
				else
				{
					alert('not supported')
				}
			}
			editDoButtons(type)
			editWin[type].focus();
		}
	}
	
	
	function editControlResize(event,type)
	{
		if(!event)event=editWin[type].event;
	}


