// ===========
// HTML EDITOR
// ===========

var allow_multiple_wysiwyg=true;

function DDT()
{
	this._ddt=function() {};
	this._ddtDumpNode=function() {};
	this.getHTMLSource=function() {};
}

function wysiwyg_on()
{
	var cookie=ReadCookie('use_wysiwyg');
	return ((cookie=='') || (cookie=='1')) && (browser_matches('wysiwyg'));
}

function toggle_wysiwyg(name)
{
	if (!browser_matches('wysiwyg'))
	{
		window.alert('WYSIWYG editing is not currently supported on your current web browser.');
		return false;
	}

	if (!window.load_XML_doc) return false;
	if (!window.merge_text_nodes) return false;
	if (!document.getElementsByClassName) return false;

	var is_wysiwyg_on=wysiwyg_on();
	SetCookie('use_wysiwyg',is_wysiwyg_on?'0':'1',3000);

	var posting_form=document.getElementById(name).form;
	var counter,name2;
	var areaedits=document.getElementsByClassName('htmlarea');
	var so=document.getElementById('post_special_options');
	var so2=document.getElementById('post_special_options2');
	var textarea_new;

	var request,result;
	if (is_wysiwyg_on)
	{
		// Find if the WYSIWYG has anything in it - if not, discard
		var all_empty=true,myregexp=new RegExp(/((\s)|(<p\d*\/>)|(<\/p>)|(<p>)|(&nbsp;)|(<br[^>]*>))*/);
		for (counter=0;counter<posting_form.elements.length;counter++)
		{
			name2=posting_form.elements[counter].name;
			if ((areaedit_editors[name2]) && (!posting_form.elements[counter].recreated_textarea))
			{
				if (areaedit_editors[name2].getHTML().replace(myregexp,'')!='') all_empty=false;
			}
		}

		// If we do not need to prompt, hard coded it with the "discard" line text, else make real prompt
		var prompt=all_empty?'Discard':generate_question_ui('You have chosen to disable WYSIWYG. You can choose whether you want to throw-away your current editing contents, or convert it - or you can cancel if you wish to return to WYSIWYG.',['Cancel','Convert to Comcode','Discard'],'Disable WYSIWYG editing','To revert to the prior Comcode text, type \'discard\' here. Press \'Cancel\' if you do not wish to disable WYSIWYG. Just press \'OK\' to continue normally.');
		if ((!prompt) || (prompt=='Cancel'))
		{
			SetCookie('use_wysiwyg','1',3000);
			return false;
		}
		var discard=(prompt.toLowerCase()=='Discard'.toLowerCase());

		for (counter=0;counter<posting_form.elements.length;counter++)
		{
			name2=posting_form.elements[counter].name;
			if ((areaedit_editors[name2]) && (!posting_form.elements[counter].recreated_textarea))
			{
				areaedit_editors[name2].deactivateEditor();
				document.getElementById(name2+'__is_wysiwyg').value='0';
				posting_form.elements[counter].id='wysiwyg_version_of_'+name2;
				posting_form.elements[counter].name='wysiwyg_version_of_'+name2;
				textarea_new=document.createElement('textarea');
				posting_form.elements[counter].replacing=textarea_new;
				textarea_new.id=name2;
				textarea_new.name=name2;
				textarea_new.recreated_textarea=true;
				textarea_new.className=posting_form.elements[counter].className;
				textarea_new.setAttribute('tabindex',posting_form.elements[counter].getAttribute('tabindex'));
				textarea_new.setAttribute('rows',posting_form.elements[counter].getAttribute('rows'));
				if ((discard) && (areaedit_original_comcode[name2]))
				{
					textarea_new.value=areaedit_original_comcode[name2];
				} else
				{
					request=load_XML_doc('/data/comcode_convert.php?from_html=1'+keep_stub(),false,'data='+window.encodeURIComponent(areaedit_editors[name2].getHTML()));
					if (!request.responseXML)
					{
						textarea_new.value='[semihtml]'+areaedit_editors[name2].getHTML()+'[/semihtml]';
					} else
					{
						var result_tags=request.responseXML.documentElement.getElementsByTagName("result");
						if (result_tags[0])
						{
							result=result_tags[0];
							textarea_new.value=merge_text_nodes(result.childNodes);
						}
						textarea_new.value=merge_text_nodes(result.childNodes);
					}
				}
				document.getElementById('container_for_'+name2).appendChild(textarea_new);
				setInnerHTML(document.getElementById('toggle_wysiwyg_'+name2),'Enable WYSIWYG editing');
			}
		}
		for (counter=0;counter<areaedits.length;counter++)
		{
			areaedits[counter].style.display='none';
		}
		if (so) so.style.display='block';
		if (so2) so2.style.display='none';
	} else
	{
		if (so) so.style.display='none';
		if (so2) so2.style.display='block';
		var old_text;
		if (areaedit_loaded)
		{
			for (counter=0;counter<areaedits.length;counter++)
			{
				areaedits[counter].style.display='block';
			}
			for (counter=0;counter<posting_form.elements.length;counter++)
			{
				if (posting_form.elements[counter].name.indexOf('wysiwyg_version_of_')!=-1)
				{
					name2=posting_form.elements[counter].name.replace(/wysiwyg\_version\_of\_/,'');
					old_text=posting_form.elements[counter].replacing.value;
					document.getElementById(name2+'__is_wysiwyg').value='1';
					posting_form.elements[counter].id=name2;
					posting_form.elements[counter].name=name2;
					posting_form.elements[counter].replacing.parentNode.removeChild(posting_form.elements[counter].replacing);
					areaedit_editors[name2].activateEditor();
					request=load_XML_doc('/data/comcode_convert.php?semihtml=1&from_html=0'+keep_stub(),false,'data='+window.encodeURIComponent(old_text));
					if (!request.responseXML)
					{
						window.alert('There was a problem receiving the result to display; it is likely your Comcode is invalid.');
						areaedit_editors[name2].setHTML(escape_html(old_text));
					} else
					{
						var result_tags=request.responseXML.documentElement.getElementsByTagName("result");
						if ((!result_tags) || (result_tags.length==0))
						{
							window.alert('There was a problem receiving the result to display; it is likely your Comcode is invalid.');
							areaedit_editors[name2].setHTML(escape_html(old_text));
						} else
						{
							result=result_tags[0];
							if (result.childNodes[0]) areaedit_editors[name2].setHTML(merge_text_nodes(result.childNodes));
						}
					}
					setInnerHTML(document.getElementById('toggle_wysiwyg_'+name2),'Disable WYSIWYG editing');
				}
			}
		} else
		{
			load_html_edit(posting_form,true);
		}
	}

	return false;
}

var areaedit_editors=[];
var areaedit_loaded=false;
var areaedit_original_comcode=[];
function load_html_edit(posting_form,ajax_copy)
{
	if ((!posting_form.getAttribute('method')) || (posting_form.getAttribute('method').toLowerCase()!='post')) return;
	
	if (!posting_form.elements['http_referer'])
	{
		var http_referer=document.createElement('input');
		http_referer.name='http_referer';
		http_referer.value=window.location.href;
		http_referer.type='hidden';
		posting_form.appendChild(http_referer);
	}
		
	//if (!window.DDT) return;
	if (!window.load_XML_doc) return;
	if (!window.merge_text_nodes) return;
	if (!window.HTMLArea) return;
	if (!browser_matches('wysiwyg')) return;
	if (!wysiwyg_on()) return;

	var so=document.getElementById('post_special_options');
	var so2=document.getElementById('post_special_options2');
	if (so) so.style.display='none';
	if (so2) so2.style.display='block';

	var counter,e_id,count=0,e,indicator,those_done=[],result,request;
	var areaedit_editors_static=[];
	for (counter=0;counter<posting_form.elements.length;counter++)
	{
		e=posting_form.elements[counter];

		if ((e.type=='textarea') && (e.className.indexOf('wysiwyg')!=-1) && (!is_comcode_xml(e)))
		{
			indicator=document.createElement('input');
			indicator.type='hidden';
			indicator.name=posting_form.elements[counter].name+'__is_wysiwyg';
			indicator.id=indicator.name;
			posting_form.appendChild(indicator);

			e_id=posting_form.elements[counter].id;
			if (those_done[e_id]) continue;
			those_done[e_id]=1;
			if ((((e_id!='post') && (posting_form.elements['post'])) || (count!=0)) && (!allow_multiple_wysiwyg))
			{
				indicator.value='0';
				continue; // Multiple WYSIWYG's causes problems in some browsers
			}

			areaedit_editors[count]=e_id;
			posting_form.elements[counter].disabled=true;
			areaedit_editors_static[count]=posting_form.elements[counter];
			areaedit_original_comcode[e_id]=areaedit_editors_static[count].value;
			count++;

			indicator.value='1';

			setInnerHTML(document.getElementById('toggle_wysiwyg_'+posting_form.elements[counter].name),'Disable WYSIWYG editing');

			if (!ajax_copy)
			{
				if (posting_form.elements[e_id+"_parsed"])
					posting_form.elements[counter].value=posting_form.elements[e_id+"_parsed"].value;
			} else
			{
				request=load_XML_doc('/data/comcode_convert.php?semihtml=1&from_html=0'+keep_stub(),false,'data='+window.encodeURIComponent(posting_form.elements[counter].value));
				var result_tags=request.responseXML.documentElement.getElementsByTagName("result");
				if (!request.responseXML)
				{
					posting_form.elements[counter].value='';
				} else
				{
					if ((!result_tags) || (result_tags.length==0))
					{
						posting_form.elements[counter].value='';
					} else
					{
						result=result_tags[0];
						posting_form.elements[counter].value=merge_text_nodes(result.childNodes);
					}
				}
			}
		}
	}
	if (count==0) return;

	var areaedit_init=function () {
		//var startupDDT=new DDT("ocPortal");
		//startupDDT._ddtOn();

		var areaedit_plugins=
		[
			'CheckOnKeyPress',
			'CharacterMap',
			//'ContextMenu',
			'EnterParagraphs',
			'FullScreen',
			'ListType',
			//
			//'TableOperations'
		];

		//startupDDT._ddt("ocPortal", "92", "calling HTMLArea.loadplugins()");

		require_css('htmlarea');

		HTMLArea.init();
		if (!HTMLArea.loadPlugins(areaedit_plugins, areaedit_init)) return;

	  	//startupDDT._ddt("ocPortal", "119", "calling HTMLArea.Config()");

		var areaedit_config=new HTMLArea.Config();
		areaedit_config.toolbar =
		[
			["htmlmode","formatblock","fontname","fontsize",/*"separator",*/"bold","italic"/*,"underline"*//*,"strikethrough"*/],
			["forecolor"/*,"hilitecolor","separator"*/],
			["subscript","superscript",/*"separator",*/"removeformat",/*"separator",*/"createlink"],
			["linebreak","justifyleft","justifycenter","justifyright"/*,"justifyfull"*/],
			["separator","insertorderedlist","insertunorderedlist","outdent","indent","separator"],
			["inserthorizontalrule","insertimage","inserttable","separator"],
			["undo","redo"],(HTMLArea.is_gecko?[]:["cut","copy","paste"]),
			/*["separator"],["toggleborders"]*/
		];
		areaedit_config.pageStyleSheets=[];
		var linked_sheets=document.getElementsByTagName('link');
		for (counter=0;counter<linked_sheets.length;counter++)
		{
			if (linked_sheets[counter].getAttribute('rel')=='stylesheet')
				areaedit_config.pageStyleSheets.push(linked_sheets[counter].getAttribute('href'));
		}
		linked_sheets=document.getElementsByTagName('style');
		areaedit_config.pageStyle='';
		var global_div=document.getElementById('global_div');
		if (global_div) areaedit_config.pageStyle='body { background-color: '+getStyle(global_div,'background-color')+' !important; }';
		areaedit_config.pageStyle=areaedit_config.pageStyle+"#main_page_title { display: block !important }";
		areaedit_config.pageStyle=areaedit_config.pageStyle+".MsoNormal, .MsoNormal, .MsoNormal { margin: 0; }";
		areaedit_config.pageStyle+='.ocp_keep { font-weight: bold;background-color: #ffddea; }';
		for (counter=0;counter<linked_sheets.length;counter++)
		{
			areaedit_config.pageStyle+=getInnerHTML(linked_sheets[counter]);
		}
		//areaedit_config.pageStyleSheets.push('/data/areaedit/override.css');

		areaedit_config.statusBar=false;
		//startupDDT._ddt("ocPortal", "140", "calling HTMLArea.makeEditors()");

		areaedit_editors=HTMLArea.makeEditors(areaedit_editors,areaedit_config,areaedit_plugins);

		//startupDDT._ddt("ocPortal","160","calling HTMLArea.startEditors()");

		HTMLArea.startEditors(areaedit_editors);
	}

	areaedit_init();
	areaedit_loaded=true;
	
	for (counter=0;counter<count;counter++)
	{
		areaedit_editors_static[counter].disabled=false;
	}
}

function getStyle(oElm, strCssRule){ // by Robert Nyman
	 var strValue = "";
	 if(document.defaultView && document.defaultView.getComputedStyle){
		  strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
	 }
	 else if(oElm.currentStyle){
		  strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
				return p1.toUpperCase();
		  });
		  strValue = oElm.currentStyle[strCssRule];
	 }
	 return strValue;
}

// =============
// NORMAL EDITOR
// =============

function is_comcode_xml(element)
{
	return (element.value.substr(0,8)=='<comcode');
}

function convert_xml(name)
{
	if (!window.load_XML_doc) return false;
	if (!window.merge_text_nodes) return false;

	var element=document.getElementById(name);

	if ((element.style.display=='none') || ((window.wysiwyg_on) && (wysiwyg_on()) && (element.parentNode.id=='container_for_post')))
	{
		window.alert('You cannot convert to Comcode XML whilst the WYSIWYG editor is enabled.');
		return false;
	}

	var old_text=element.value;
	var request=load_XML_doc('/data/comcode_convert.php?to_comcode_xml=1'+keep_stub(),false,'data='+window.encodeURIComponent(old_text));
	var result=((request) && (request.responseXML) && (request.responseXML.documentElement))?request.responseXML.documentElement.getElementsByTagName("result")[0]:null;
	if ((result) && (result.childNodes[0].data)) element.value=merge_text_nodes(result.childNodes);
	else
	{
		var error_window=window.open();
		error_window.document.write(request.responseText);
		error_window.document.close();
		window.alert('Your Comcode could not be parsed and hence could not be converted. You will be shown a Comcode debugger if you try to submit this form. Alternatively, there could have been a connection error.');
	}

	return false;
}

function do_emoticon(field_name,p,_opener)
{
	var element;
	if (_opener)
	{
		element=opener.document.getElementById(field_name);
	} else
	{
		element=document.getElementById(field_name);
	}
	element=ensure_true_id(element,field_name);

	if ((element.style.display=='none') || ((window.wysiwyg_on) && (wysiwyg_on()) && (element.parentNode.id=='container_for_post')))
	{
		if (_opener)
		{
			if (!opener.areaedit_editors) return;
			opener.areaedit_editors[element.id].insertHTML(opener.areaedit_editors[element.id].getSelectedHTML()+getInnerHTML(p));
		} else
		{
			areaedit_editors[element.id].insertHTML(areaedit_editors[element.id].getSelectedHTML()+getInnerHTML(p));
		}
		return;
	}

	var text=is_comcode_xml(element)?'<emoticon>'+escape_html(p.title)+'</emoticon>':(' '+p.title+' ');

	if (_opener)
	{
		insertTextboxOpener(element,text);
	} else
	{
		insertTextbox(element,text);
	}
}

function do_attachment(field_name,id,description)
{
	if (!opener.areaedit_editors) return;

	if (!description) description='';

	var element=opener.document.getElementById(field_name);
	element=ensure_true_id(element,field_name);

	var comcode;
	if (!is_comcode_xml(element))
	{
		comcode='\n\n[attachment type="island" description="'+escape_comcode(description)+'"]'+id+'[/attachment]';
	} else
	{
		comcode='<br /><br /><attachment type="island"><attachmentDescription>'+description+'</attachmentDescription>'+id+'</attachment>';
	}

	if ((element.style.display=='none') || ((window.wysiwyg_on) && (wysiwyg_on()) && (element.parentNode.id=='container_for_post')))
	{
		opener.areaedit_editors[element.id].insertHTML(opener.areaedit_editors[element.id].getSelectedHTML()+comcode);
	} else
	{
		insertTextboxOpener(element,comcode);
	}
}

function ensure_true_id(element,field_name) // Works around IE bug
{
	var form=element.form;
	var i;
	for (i=0;i<form.elements.length;i++)
	{
		if ((form.elements[i].id==field_name) || (form.elements[i].name==field_name))
		{
			return form.elements[i];
		}
	}
	return element;
}

function insertTextbox(element,text,sel)
{
	if ((element.style.display=='none') || ((window.wysiwyg_on) && (wysiwyg_on()) && (element.parentNode.id=='container_for_post')))
	{
		areaedit_editors[element.id].insertHTML(areaedit_editors[element.id].getSelectedHTML()+text);
		return;
	}

	var from=element.value.length,to;

	element.focus();

	if (!sel) sel=document.selection?document.selection:null;

	if (element.selectionEnd) // Mozilla style
	{
		from=element.selectionStart;
		to=element.selectionEnd;

		var start=element.value.substring(0,from);
		var end=element.value.substring(to,element.value.length);

		element.value=start+element.value.substring(from,to)+text+end;
		setSelectionRange(element,from+text.length,from+text.length);
	} else
	if (sel) // IE style
	{
		var ourRange=sel.createRange();
		if ((ourRange.moveToElementText) || (ourRange.parentElement()==element))
		{
			if (ourRange.parentElement()!=element) ourRange.moveToElementText(element);
			ourRange.text=ourRange.text+text;
		} else
		{
			element.value+=text;
			from+=2;
			setSelectionRange(element,from+text.length,from+text.length);
		}
	}
	else
	{
		// :(
		from+=2;
		element.value+=text;
		setSelectionRange(element,from+text.length,from+text.length);
	}
}
function insertTextboxOpener(element,text)
{
	insertTextbox(element,text,opener.document.selection);
}

function insertTextboxWrapping(element,beforeWrapTag,afterWrapTag)
{
	var from,to;

	if (afterWrapTag=="")
	{
		if (!is_comcode_xml(element))
		{
			afterWrapTag="[/"+beforeWrapTag+"]";
			beforeWrapTag="["+beforeWrapTag+"]";
		} else
		{
			afterWrapTag="</"+beforeWrapTag+">";
			beforeWrapTag="<"+beforeWrapTag+">";
		}
	}

	if ((element.style.display=='none') || ((window.wysiwyg_on) && (wysiwyg_on()) && (element.parentNode.id=='container_for_post')))
	{
		areaedit_editors[element.id].insertHTML(beforeWrapTag+areaedit_editors[element.id].getSelectedHTML()+afterWrapTag);
		return;
	}

	if (element.selectionEnd) // Mozilla style
	{
		from=element.selectionStart;
		to=element.selectionEnd;

		var start=element.value.substring(0,from);
		var end=element.value.substring(to,element.value.length);

		if (to>from)
		{
			element.value=start+beforeWrapTag+element.value.substring(from,to)+afterWrapTag+end;
		} else
		{
			element.value=start+beforeWrapTag+afterWrapTag+end;
		}
		setSelectionRange(element,from,to+beforeWrapTag.length+afterWrapTag.length);
	} else
	if (document.selection) // IE style
	{
		element.focus();
		var sel=document.selection;
		var ourRange=sel.createRange();
		if ((ourRange.moveToElementText) || (ourRange.parentElement()==element))
		{
			if (ourRange.parentElement()!=element) ourRange.moveToElementText(element);
			ourRange.text=beforeWrapTag+ourRange.text+afterWrapTag;
		} else element.value+=beforeWrapTag+afterWrapTag;
	}
	else
	{
		// :(
		element.value+=beforeWrapTag+afterWrapTag;
		setSelectionRange(element,from,to+beforeWrapTag.length+afterWrapTag.length);
	}
}

// From http://www.faqts.com/knowledge_base/view.phtml/aid/13562
function setSelectionRange(input,selectionStart,selectionEnd)
{
	if (input.setSelectionRange) /* Mozilla style */
	{
		input.focus();
		input.setSelectionRange(selectionStart,selectionEnd);
	}
	else if (input.createTextRange) /* IE style */
	{
		var range=input.createTextRange();
		range.collapse(true);
		range.moveEnd('character',selectionEnd);
		range.moveStart('character',selectionStart);
		range.select();
	} else input.focus();
}
	  



