//Allgemeine Variablen definieren
var mgv_wysiwygOpenClasses = new Array();

var GOOD_BROWSERS = new Array();
GOOD_BROWSERS[GOOD_BROWSERS.length]="Firefox";
GOOD_BROWSERS[GOOD_BROWSERS.length]="MSIE\\s6\\.";
GOOD_BROWSERS[GOOD_BROWSERS.length]="MSIE\\s7\\.";
GOOD_BROWSERS[GOOD_BROWSERS.length]="Gecko\\/2007";
GOOD_BROWSERS[GOOD_BROWSERS.length]="Gecko\\/2008";
GOOD_BROWSERS[GOOD_BROWSERS.length]="Gecko\\/2009";
GOOD_BROWSERS[GOOD_BROWSERS.length]="Gecko\\/201";
GOOD_BROWSERS[GOOD_BROWSERS.length]="AppleWebKit\\/([6-9][0-9][0-9])|(5[3-9][0-9])|(52[7-9])";

//Allgemeine Funktion um den WYSIWYG zu starten
mgv_wysiwyg = function (TArea,IFrameId,this_name,ImageBtns) {
	//Eigenen Namen für die Popups speichern
	this.MyName=this_name;
	//PAGE_ID vom Script speichern, damit die Popups nichts falsches Ausgeben
	this.PAGEid=PAGE_ID;
	//Symbole für die Bearbeitung (Nach Sprachen sortiert)
	switch(DE_LANG) {
		case "en":
		this.Buttons = new Array(
	  	  new Array(DE_PICS+"icons/button_bold.png","bold","bold text","CSBold()","Button"),  
	  	  new Array(DE_PICS+"icons/button_italic.png","italic","italic text","CSItalic()","Button"),  
	  	  new Array(DE_PICS+"icons/button_underlined.png","underlined","underlined text","CSUnderlined()","Button"),  
	  	  new Array(DE_PICS+"icons/button_link.png","link","link","CSLink()","Button"),  
	  	  new Array(DE_PICS+"icons/button_headline.png","headline 1","headline 1","FB('h1')","Button"),  
	  	  new Array(DE_PICS+"icons/button_headline_2.png","headline 2","headline 2","FB('h2')","Button"),  
	  	  new Array(DE_PICS+"icons/button_headline_3.png","headline 3","headline 3","FB('h3')","Button"),  
	  	  new Array(DE_PICS+"icons/button_normal.png","normal","normal","FB('p')","Button"),
	  	  new Array(DE_PICS+"icons/button_table.png","table","insert table","InsertTable()","Button"),
	  	  new Array(DE_PICS+"icons/button_code.png","source code","view source code","SourceCode()","Button"));	
		//Buttons werden nur angezeigt, wenn gewünscht und wenn Userfiles Modul existiert
		if(ImageBtns) this.Buttons.push(
	  	  new Array(DE_PICS+"icons/button_image.png","image","image","popup('ImageNew','normal')","Button"),  
		  new Array(DE_PICS+"icons/button_image_left.png","image","left image","popup('ImageNew','left')","Button"),
		  new Array(DE_PICS+"icons/button_image_right.png","image","right image","popup('ImageNew','right')","Button"));
		//Weitere Fragen und Texte festlegen
		this.language = new Object();
		this.language["q_link"] = "Please enter the target of the link:";
		this.language["wysiwyg"]=new Array(DE_PICS+"icons/button_code.png","WYSIWYG","view Preview","Show()","Button");	
		this.language["sourcecode"] = "Attention! You are working in the source code.";
		this.language["no_support"] = "Ihr Browser unterstützt diese Funktion nicht. Bitte wenden Sie sich an die Administration. Sie befinden sich im Quellcode.";
		break;
		case "de":
		default:
		this.Buttons = new Array(
	  	  new Array(DE_PICS+"icons/button_bold.png","Fett","Fetter Text","CSBold()","Button"),  
	  	  new Array(DE_PICS+"icons/button_italic.png","Kursiv","Kursiver Text","CSItalic()","Button"),  
	  	  new Array(DE_PICS+"icons/button_underlined.png","Unterstrichen","Unterstrichener Text","CSUnderlined()","Button"),  
	  	  new Array(DE_PICS+"icons/button_link.png","Link","Link","CSLink()","Button"),  
	  	  new Array(DE_PICS+"icons/button_headline.png","Überschrift 1","Überschrift 1","FB('h1')","Button"),  
	  	  new Array(DE_PICS+"icons/button_headline_2.png","Überschrift 2","Überschrift 2","FB('h2')","Button"),  
	  	  new Array(DE_PICS+"icons/button_headline_3.png","Überschrift 3","Überschrift 3","FB('h3')","Button"),  
	  	  new Array(DE_PICS+"icons/button_normal.png","Normal","Normal","FB('p')","Button"),
	  	  new Array(DE_PICS+"icons/button_table.png","Tabelle","Tabelle einfügen","InsertTable()","Button"),
	  	  new Array(DE_PICS+"icons/button_code.png","Quellcode","Zeige Quellcode","SourceCode()","Button"));	
		//Buttons werden nur angezeigt, wenn gewünscht und wenn Userfiles Modul existiert
		if(ImageBtns) this.Buttons.push(
	  	  new Array(DE_PICS+"icons/button_image.png","Bild","Bild","popup('ImageNew','normal')","Button"),  
		  new Array(DE_PICS+"icons/button_image_left.png","Bild","Linkes Bild","popup('ImageNew','left')","Button"),
		  new Array(DE_PICS+"icons/button_image_right.png","Bild","Rechtes Bild","popup('ImageNew','right')","Button"));
		//Weitere Fragen und Texte festlegen
		this.language = new Object();
		this.language["wysiwyg"]=new Array(DE_PICS+"icons/button_code.png","WYSIWYG","Zeige Vorschau","Show()","Button");	
		this.language["q_link"] = "Bitte geben Sie ihr Linkziel an:";
		this.language["sourcecode"] = "ACHTUNG! Sie befinden sich im Quellcode.";
		this.language["no_support"] = "Ihr Browser unterstützt diese Funktion nicht. Bitte wenden Sie sich an die Administration. Sie befinden sich im Quellcode.";
		break;	
	}
	//Speichern, ob es ein Internet Explorer ist
	var browserName = navigator.appName;
	if (browserName == "Microsoft Internet Explorer")	this.IE = true;
	else												this.IE = false;

	//Browser ohne Unterstützung abfangen
	this.NO_PREVIEW=true;
	for(var i=0;i<GOOD_BROWSERS.length;i++){
		eval("if(navigator.userAgent.match(/.*"+GOOD_BROWSERS[i]+".*/)) this.NO_PREVIEW=false;");
	}

	//Wie viele Reihen sollen zur TA bei der Quellcode ansicht hinzugefügt werden?
	this.rowsPush2TA = 10;
	//Erzeugt die Buttonzeile und gibt sie zurück
	this.CreateBtns = function () {
		var Btn = this.Buttons;
		var E;
		var Res = document.createElement("div");
		for(var i=0; i<Btn.length; i++) {
			E=document.createElement("img");
			E.src=Btn[i][0];
			E.alt=Btn[i][1];
			E.title=Btn[i][2];
			E.title=Btn[i][2];
			E.className=Btn[i][4];
			E.border=0;
			if(this.IE) 
				eval("E.attachEvent('onclick', function() { "+this.MyName+"."+Btn[i][3]+" })");
			else 
				eval("E.addEventListener('click',function OnClick() { "+this.MyName+"."+Btn[i][3]+" }, true)");
			Res.appendChild(E);
		}
		return Res;
	}
	//Zeigt den Quellcode an
	this.SourceCode = function() {
		if(!this.NO_PREVIEW){
			UpdateTArea();
			var Div=document.getElementById("Btns2"+this.TAreaID);
			Div.parentNode.removeChild(Div);
			delete(Div);
			var IFrame=document.getElementById(this.ID);
			IFrame.parentNode.removeChild(IFrame);
			//Jetzt wieder neuen Button mit Code anzeigen
			var Btn =this.language["wysiwyg"];
			var Res = document.createElement("div");
			var Text = document.createTextNode(this.language["sourcecode"]);
			Res.appendChild(Text);
			var E	=document.createElement("img");
			E.src=Btn[0];
			E.alt=Btn[1];
			E.title=Btn[2];
			E.title=Btn[2];
			E.className=Btn[4]; 
			E.border=0;
			E.style.marginLeft="20px";
			if(this.IE) 
				eval("E.attachEvent('onclick', function() { "+this.MyName+"."+Btn[3]+" })");
			else 
				eval("E.addEventListener('click',function OnClick() { "+this.MyName+"."+Btn[3]+" }, true)");
			Res.appendChild(E);
			Res.id = "Btns2"+this.TAreaID;
		}else{
			var Btn =this.language["wysiwyg"];
			var Res = document.createElement("div");
			Res.style.color="#FF0000";
			var Text = document.createTextNode(this.language["no_support"]);
			Res.appendChild(Text);
			document.getElementById(this.TAreaID).parentNode.insertBefore(Res,document.getElementById(this.TAreaID));
			delete(Res);
		}
		document.getElementById(this.TAreaID).style.display = "inline";
		document.getElementById(this.TAreaID).style.fontFamily = "monospace";
		document.getElementById(this.TAreaID).rows+=this.rowsPush2TA;
		if(!this.NO_PREVIEW){
			document.getElementById(this.TAreaID).parentNode.insertBefore(Res,document.getElementById(this.TAreaID));
			delete(Res);
			document.getElementById(this.TAreaID).focus();
		}
	}
	//Alles anzeigen
	this.Show = function() {
		if(document.getElementById("Btns2"+this.TAreaID)) {
			var Div=document.getElementById("Btns2"+this.TAreaID);
			Div.parentNode.removeChild(Div);
			delete(Div);
			document.getElementById(this.TAreaID).value=ParseHTML2Tidy(document.getElementById(this.TAreaID).value);
			document.getElementById(this.TAreaID).rows-=this.rowsPush2TA;
		}
		var Div = this.CreateBtns();
		Div.id = "Btns2"+this.TAreaID;
		document.getElementById(this.TAreaID).parentNode.appendChild(Div);
		delete(Div);
		var IFrame = document.createElement("iframe");
		IFrame.id = this.ID;
		IFrame.style.margin = "1px";
		document.getElementById(this.TAreaID).parentNode.appendChild(IFrame);
		//Textareafeld unsichtbar machen, wenn es geht
		document.getElementById(this.TAreaID).style.display='none';
		//Zeiger auf Doc
		var HTMLvalue=document.getElementById(this.TAreaID).value;
		with(document.getElementById(this.ID).contentWindow.document) {
			//Update der Textareadaten auf den IFrame
			open();
			write(ParseTidy2HTML(HTMLvalue));
			close();
			//Fenster beschreibar machen und CSS ausschalten
			body.contentEditable = true;
			designMode = "on";
			if(!this.IE) execCommand('styleWithCSS',false,false);
		}
		//Submit abfangen
		var form=document.getElementById(this.TAreaID).form;
		if (this.IE) form.attachEvent('onsubmit', function() { UpdateTArea() });
		else form.addEventListener('submit',UpdateTArea, true);
	    //Den Start auf <p> setzen
	    if(document.getElementById(this.TAreaID).value=="") this.FB("p");
		document.getElementById(this.ID).contentWindow.focus();
	}
	//Fetten Text erzeugen
	this.CSBold = function() {
		this.ChangeSelection("bold",null);
	}
	//Kursiven Text erzeugen
	this.CSItalic = function() {
		this.ChangeSelection("italic",null);
	}
	//Unterstrichenen Text erzeugen
	this.CSUnderlined = function() {
		this.ChangeSelection("underline",null);
	}
	//Einen Link erzeugen
	this.CSLink = function() {
		var url = window.prompt(this.language["q_link"],"http://");
		if(url!=null) this.ChangeSelection('createlink',url);
	}
	//Markierten Text in Bestimmten Blockelement einbinden
	this.FB = function(element) {
		this.ChangeSelection("formatblock","<"+element+">");
	}
	//Formatiert Ausgewählten Text mit gegebenen Sachen
	this.ChangeSelection = function (aTag,src) {
		document.getElementById(this.ID).contentWindow.focus();
		if(this.IE && aTag=="inserthtml") 
			document.getElementById(this.ID).contentWindow.document.selection.createRange().pasteHTML(src);
		else
			document.getElementById(this.ID).contentWindow.document.execCommand(aTag, false, src);
	}
	//Tabelle einfügen
	this.InsertTable = function () {
		this.ChangeSelection('inserthtml','<table border="1" cellpadding="5"><tr><td></td><td></td></tr><tr><td></td><td></td></tr></table><p></p>');
	}
	//öffnet ein Popup
	this.popup = function (type,align) {
		var popup = open('popup.php?mod='+type+'&MyName='+this.MyName+'&align='+align+'&PAGEid='+this.PAGEid,'_MGVmedia_images_select', 'HEIGHT=400,WIDTH=450,resizable=yes,scrollbars=yes'); 
		popup.focus();
	}
	//Auf globales Array übertragen
	var Arr = new Array();
	Arr[0]  = TArea;
	Arr[1]  = IFrameId;
	mgv_wysiwygOpenClasses[mgv_wysiwygOpenClasses.length]=Arr;
	//Funktionen definieren
	this.ID 		= IFrameId;
	this.TAreaID 	= TArea;
	//Alles anzeigen
	if(!this.NO_PREVIEW) this.Show();
	//Nur Quellcode anzeigen
	else this.SourceCode();
}

//Updated die Informationen des IFrames in die Textarea
UpdateTArea = function () {
	for(var i=0; i<mgv_wysiwygOpenClasses.length; i++) {
		if(document.getElementById(mgv_wysiwygOpenClasses[i][1])) {
			Code = ParseHTML2Tidy(document.getElementById(mgv_wysiwygOpenClasses[i][1]).contentWindow.document.body.innerHTML);
			var OldCode;
			do {
				OldCode = Code;
				Code = ParseHTML2Tidy(Code);
			} while(Code!=OldCode);
			delete(OldCode);
			document.getElementById(mgv_wysiwygOpenClasses[i][0]).value = Code;
		}
	}
}

function ParseHTML2Tidy(Code) {
	Code=Code+"<ENDE>";
	if(Code=="<br>" || Code=="<br/>") Code="";
	//Strong usw zu Tidy
	Code = Code.replace(/(<STRONG>)|(<B>)/gi,'<b>');
	Code = Code.replace(/(<\/STRONG>)|(<\/B>)/gi,'</b>');
	Code = Code.replace(/(<EM>)|(<I>)/gi,'<i>');
	Code = Code.replace(/(<\/EM>)|(<\/I>)/gi,'</i>');
	Code = Code.replace(/<U>/gi,'<u>');
	Code = Code.replace(/<\/U>/gi,'</u>');
	Code = Code.replace(/<P>/gi,'<p>');
	Code = Code.replace(/<\/P>/gi,'</p>');
	Code = Code.replace(/<TR>/gi,'<tr>');
	Code = Code.replace(/<\/TR>/gi,'</tr>');
	Code = Code.replace(/<TD>/gi,'<td>');
	Code = Code.replace(/<\/TD>/gi,'</td>');
	Code = Code.replace(/<TBODY>/gi,'<tbody>');
	Code = Code.replace(/<\/TBODY>/gi,'</tbody>');
	Code = Code.replace(/<TABLE([^>]*)>/gi,'<table$1>');
	Code = Code.replace(/<\/TABLE>/gi,'</table>');
	Code = Code.replace(/<H([1-6])>/gi,'<h$1>');
	Code = Code.replace(/<\/H([1-6])>/gi,'</h$1>');
	Code = Code.replace(/(<br\/>)|(<br>)/gi,'<br>');
	//Anfürungszeichen um Attribute setzen
	var OldCode;
	do {
		OldCode = Code;
		Code = Code.replace(/<(\w+)([^>]*) (\w+)=(\w+)([^>]*)>/gi, '<$1$2 $3="$4"$5>');
	} while(Code!=OldCode);
	delete(OldCode);
	//Größenangaben aus Tabellen entfernen
	Code = Code.replace(/<table([^>]+)style="[^"]+"([^>]*)>/g, '<table$1$2>');
	//Größenangaben aus Bilder ordentlich machen
	Code = Code.replace(/<img([^>]+)width="[0-9]+"([^>]+)style="([^"]*)width: *([0-9]+)px;*([^"]*)"([^>]*)>/gi, '<img$1$2style="$3width:$4px;$5"$6>');
	Code = Code.replace(/<img([^>]+)style="([^"]*)width: *([0-9]+)px;*([^"]*)"([^>]*)width="[0-9]+"([^>]*)>/gi, '<img$1style="$2width:$3px;$4"$5$6>');
	Code = Code.replace(/<img([^>]+)height="[0-9]+"([^>]+)style="([^"]*)height: *([0-9]+)px;*([^"]*)"([^>]*)>/gi, '<img$1$2style="$3height:$4px;$5"$6>');
	Code = Code.replace(/<img([^>]+)style="([^"]*)height: *([0-9]+)px;*([^"]*)"([^>]*)height="[0-9]+"([^>]*)>/gi, '<img$1style="$2height:$3px;$4"$5$6>');
	Code = Code.replace(/<img([^>]+)width="([0-9]+)"([^>]*)>/gi,'<img$1style="width:$2px;"$3>');
	Code = Code.replace(/<img([^>]+)height="([0-9]+)"([^>]*)>/gi,'<img$1style="height:$2px;"$3>');
	//Vertical Aligns aus den Tabellen rausfiltern
	Code = Code.replace(/valign="top"/gi,'');
	//Komische BR 
	Code = Code.replace(/<br><\/td>/gi,'</td>');
	Code = Code.replace(/<br><\/p>/gi,'</p>');
	//Height in Tabellen raus
	Code = Code.replace(/<table([^>]*)? height="[0-9]+"([^>]*)?>/gi,'<table$1$2>');
	//width in Tabellen raus
	Code = Code.replace(/<table([^>]*)? width="[0-9]+"([^>]*)?>/gi,'<table$1$2>');
	//Border raus
	Code = Code.replace(/<table([^>]*)? border="[0-9]+"([^>]*)?>/gi,'<table$1$2>');
	//Cesllpadding raus
	Code = Code.replace(/<table([^>]*)? cellpadding="[0-9]+"([^>]*)?>/gi,'<table$1$2>');
	//TBody MUSS raus
	Code = Code.replace(/(<tbody>)|(<\/tbody>)/gi,'');
	//Leere Styles entfernen
	var OldCode;
	do {
		OldCode = Code;
		Code = Code.replace(/<(\w+)([^>]*) style="\s*"([^>]*)>/gi, '<$1$2 $3>');
	} while(Code!=OldCode);
	delete(OldCode);
	//Doppelte Leerzeilen entfernen
	var OldCode;
	do {
		OldCode = Code;
		Code = Code.replace(/(\n)|(\r\n)/gi, ' ');
	} while(Code!=OldCode);
	delete(OldCode);
	//Doppelte Style Attribute zusammensetzen
	var OldCode;
	do {
		OldCode = Code;
		Code = Code.replace(/<(\w+)([^>]+)style="([^"]+)"([^>]*)style="([^"]+)"([^>]*)>/gi, '<$1$2style="$3$5"$4$6>');
	} while(Code!=OldCode);
	delete(OldCode);
	Code = Code.replace(/(<\/p>|<\/h[1-6]>|<\/table>)\s*<br>/gi,'$1');
	//Nochmal irgendwas doppeltes rausfiltern
	var OldCode;
	do {
		OldCode = Code;
		Code = Code.replace(/<p>((?:[^<]|<img|<b>|<u>|<i>|<a|<\/i>|<\/u>|<\/b>)*)?<table>(.*)<\/table>((?:[^<]|<img|<b>|<u>|<i>|<a|<\/i>|<\/u>|<\/b>)*)?<\/p>/,"<p>$1</p><table>$2</table><p>$3</p>");
		Code = Code.replace(/(<p><\/p>)|(<p>&nbsp;<\/p>)/gi,'');
	} while(Code!=OldCode);
	delete(OldCode);
	Code = Code.replace(/^((?:[^<]|<img|<b>|<u>|<i>|<a|<\/i>|<\/u>|<\/b>)*)/gi,'<p>$1</p>');
	Code = Code.replace(/(<\/p>|<\/h[1-6]>|<\/table>)\s*<br>/gi,'$1');
	Code = Code.replace(/<(b|i|u|strong|em|)>\s*<\/\1>/,'');
	//An Stellen, wo keine P stehen welche einsetzen
	var OldCode;
	do {
		OldCode = Code;
		Code = Code.replace(/(<\/table>|<\/h[1-6]>|<\/p>)((?:[^<]|<img|<b>|<u>|<i>|<a)(?:[^<]|<img|<b>|<u>|<i>|<a|<\/i>|<\/u>|<\/b>)*)</gi,'$1<p>$2</p><');
		Code = Code.replace(/(<p><\/p>)|(<p>&nbsp;<\/p>)/gi,'');
	} while(Code!=OldCode);
	delete(OldCode);
	//Sinnlose Breaks
	Code = Code.replace(/<\/p>\s*<br>\s*<p>/gi,'</p><p>');
	Code = Code.replace(/<br>\s*<br>\s*(<br>)+/gi,'<br><br>');
	Code = Code.replace(/(<\/p>|<\/h[1-6]>|<\/table>)\s*<br>/gi,'$1');
	Code = Code.replace(/<br>\s*(<\/p>|<\/h[1-6]|<\/table>)/gi,'$1');
	Code = Code.replace(/(<\/table>|<\/h[1-6]>|<\/p>)((?:[^<]|<img|<b>|<u>|<i>|<a)(?:[^<]|<img|<b>|<u>|<i>|<a|<\/i>|<\/u>|<\/b>)*)</gi,'$1<p>$2</p><');
	//gefloatete Bilder aus den p und h und table entfernen und nach vorne stellen
	Code = Code.replace(/<(p|h[1-6]|table)>(?:((?:[^<]|<img|<b>|<u>|<i>|<a|<\/i>|<\/u>|<\/b>)*)(<img[^>]*style="[^>"]*float[^>"]*"[^>]*>)((?:[^<]|<img|<b>|<u>|<i>|<a|<\/i>|<\/u>|<\/b>)*))?<\/\1>/gi,'$3<$1>$2 $4</$1>');
	//Leere p und H
	Code = Code.replace(/(?:<(p|h[1-6])>\s*<\/\1>)|(?:<(p|h[1-6])>&nbsp;<\/\2>)/gi,'');
	//Sinnlose Whitespaces entfernen
	Code = Code.replace(/<\/(td|tr|th)>\s+</gi,'</$1><');
	Code = Code.replace(/<(tr|table)>\s+</gi,'<$1><');
	//<br> -> <br/>
	var OldCode;
	do {
		OldCode = Code;
		Code = Code.replace(/<br>/gi,'<br/>');
	} while(Code!=OldCode);
	delete(OldCode);
	//<img> -> <img/>
	Code = Code.replace(/<img([^>]+[^/>])>/gi,'<img$1/>');
	//Whitespaces
	Code = Code.replace(/ >/gi,'>');
	//Schönen Quelltext machen
	Code = Code.replace(/(<\/p>|<\/table>|<\/tr>|<\/h[1-6]>)/gi,'$1\n');
	//Das logische Ende entfernen
	Code = Code.replace(/<ENDE>/,'');
	return Code;
}
function ParseTidy2HTML(Code) {
	//border hinzufügen, für bessere Sicht
	Code = Code.replace(/<table([^>]*)?>/g,'<table$1 border="1">');
	Code = Code.replace(/<table([^>]*)?>/g,'<table$1 cellpadding="5">');
	return Code;
}

