function extractFunctionCode(vData, vFuncName)
{
	var firstPos=vData.indexOf("function "+vFuncName);
	var lastPos=firstPos;
	var braces=-1;

	if (firstPos!=-1)
	{
		for (var pZ=firstPos; pZ<vData.length; pZ++)
		{
			var c=vData.substr(pZ, 1);
			braces=(c=="{"?(braces==-1?1:braces+1):(c=="}"?braces-1:braces));
			
			// Klammern geschlossen, Schleife beenden
			if (braces==0)
			{
				lastPos=pZ+1;
				break;
			}
			
		} // End-for
	}
	
	return vData.substring(firstPos, lastPos);
}

/**
	Führt den JavaScript zwischen SCRIPT-Tags aus.

	@param string vData Text der geparst werden soll.
	@param boolean vReturnScriptValues true|false, Liefert die geparsten Script-Tags als Ergebnis zurück, optional, default=false
*/
function htmlJsExecution(vData, vReturnScriptValues)
{
	vData=vData.replace(/(<!\-\-|\/\/\-\->)/g, ""); // JS-Kommentar entfernen
	vData=vData.replace(/[^:]\/\/.*/g, ""); // Kommentar 1 entfernen
	vData=vData.replace(/^\/\/.*/g, ""); // Kommentar 2 entfernen
	vData=vData.replace(/[\r\n]/g, ""); // Zeilenumbrüche für Suche entfernen
	vData=vData.replace(/var /g, ""); // Mit var definierte Global Variablen werden nicht global angelegt
		
	var scriptsErg=vData.match(/<script.*?>(.*?)<\/script>/gi);
	var returnValue=new Array();

	if (scriptsErg)
	{
		for (var r=0; r<scriptsErg.length; r++)
		{
			var scriptValue=scriptsErg[r].match(/<script.*?>(.*?)<\/script>/i);
			scriptValue=scriptValue[1];
			
			// Überprüfen ob Funktionen vorhanden sind, die umgesetzt werden müssen
			var funcsValues=scriptValue.match(/function (.*?)\(/gi);
			
			if (funcsValues)
			{
				for (fv=0; fv<funcsValues.length; fv++)
				{
					var funcName=funcsValues[fv].match(/function (.*?)\(/i);
					funcName=funcName[1];
					
					if (funcName=="")
					{continue;
					}
					
					var funcCode=extractFunctionCode(scriptValue, funcName);
					
					var newFuncValueRegValues=funcCode.match(/function (.*?)\((.*?)\)(.*)/i);
					
					if (newFuncValueRegValues)
					{
						newFuncValueRegValues[3]=newFuncValueRegValues[3].replace(/\\(["'])/g, "\\\\$1");
						newFuncValueRegValues[3]=newFuncValueRegValues[3].replace(/(["'])/g, "\\$1");
						var newFuncValue=newFuncValueRegValues[1]+"=new Function(\""+newFuncValueRegValues[2]+"\", \""+newFuncValueRegValues[3]+"\");";
				 
						scriptValue=scriptValue.replace(funcCode, newFuncValue);
					}
				} // End-for
			}
			
			if (typeof vReturnScriptValues=="undefined" || (typeof vReturnScriptValues!="undefined" && !vReturnScriptValues) )
			{
				eval(scriptValue);
			}
			else
			{returnValue[returnValue.length]=scriptValue;
			}
		} // End-For
	}
	
	return (typeof vReturnScriptValues!="undefined" && vReturnScriptValues?returnValue:true);
}
