$(document).ready( function () {
	// fügt dem button ein event zu
	$("#calculate").click( function () {
		// er-/enthält die Funktion
		funktion		= $("#myfunc").attr("value");

		// er-/enthält Parameter zum Berechnen und Zeichnen
		startwert		= Number($("#range input:eq(0)").attr("value"));
		endwert			= Number($("#range input:eq(1)").attr("value"));
		schrittweite	= Number($("#range input:eq(2)").attr("value"));

		// Parameter für Anzeigebereich
		xMin			= Number($("#view input:eq(0)").attr("value"));
		xMax			= Number($("#view input:eq(1)").attr("value"));
		yMin			= Number($("#view input:eq(2)").attr("value"));
		yMax			= Number($("#view input:eq(3)").attr("value"));
		width			= Number($("#view input:eq(4)").attr("value"));
		height			= Number($("#view input:eq(5)").attr("value"));

		// setzt Größe des Ausgabefensters
		$("#graph").css({width: width + "px", height: height + "px"});

		// Punkte zum Zeichnen
		var1 = new Array;
		// Ersetzungen
		funktion = funktion.replace(/[\s]+/g, "");
		funktion = funktion.replace(/,/g, ".");
		funktion = funktion.replace(/²/g, "[2]");
		funktion = funktion.replace(/³/g, "[3]");

		// fügt Multiplikationszeichen vor Variablen ein
		while ( var2 = /([0-9]+)([a-zA-Z])/g.exec ( funktion ) ) {
			// neue RegExp
			var var3 = new RegExp ( var2[0] );
			//alert(var2);
			// fügt Multiplikationszeichen ein
			funktion = funktion.replace(var3, var2[1] + "*" + var2[2]);
			//alert(funktion);
		}

		// fügt Multiplikationszeichen vor öffnenden Klammern ein
		while ( var2 = /([a-zA-Z0-9\)\]])\(/g.exec ( funktion ) ) {
			//alert(var2);
			// neue RegExp
			var var3 = new RegExp ( var2[1] + "\\(" );
			//alert(var3);
			// fügt Multiplikationszeichen ein
			funktion = funktion.replace(var3, var2[1] + "*(");
			//alert(funktion);
		}

		// ersetzt Potenzschreibweise
		while ( var2 = /([0-9]+|[a-zA-Z])\[([0-9]+)\]/g.exec ( funktion ) ) {
			// neue RegExp
			var var3 = new RegExp ( var2[1] + "\\[" + var2[2] + "\\]" );
			// ersetzen
			funktion = funktion.replace(var3, "Math.pow(" + var2[1] + ", " +  var2[2] + ")");
			//alert(funktion);
		}

		// ersetzt Potenzschreibweise - 2. Teil - mit Klammern		
		while ( var2 = /([\)]+)\[([0-9]+)\]/g.exec ( funktion ) ) {
			// ermittelt Position des Treffers
			var pos = funktion.search( /([\)]+)\[([0-9]+)\]/ );
			// Anzahl der schließenden Klammern
			var count = var2[1].match( /\)/g );
			count = count.length
			pos += count-1;
			// sucht vor schließenden Klammern nach weiteren Klammern - Abbruch wenn öffnende Klammern gleich schließende oder Anfang
			for ( var i = pos-count; i >= 0; i-- )
			{
				if ( funktion.substr(i, 1) == "(" ) count--;
				if ( funktion.substr(i, 1) == ")" ) count++;

				if ( count == 0) break; 
			}
			// zu potenziernde Funktion
			var subfunc = funktion.substring( i+1, pos );
			// Ersetzungen
			var2[1] = funktion.substring( i, pos+1 ).replace(/\)/g, "\\)");
			var2[1] = var2[1].replace(/\(/g, "\\(");
			var2[1] = var2[1].replace(/\+/g, "\\+");
			var2[1] = var2[1].replace(/\*/g, "\\*");
			var2[1] = var2[1].replace(/\//g, "\\/");
			// neue RegExp
			var var3 = new RegExp ( var2[1] + "\\[" + var2[2] + "\\]" );
			// ersetzen
			funktion = funktion.replace(var3, "Math.pow(" + subfunc + ", " +  var2[2] + ")" );
			//alert(funktion);
		}
		
		// zeigt Funktion an
		$("#func").html(funktion);

		// Schleife zum Ersetzen der Variablen durch Werte
		for ( var i = startwert; i <= endwert; i += schrittweite ) {
			// ersetzt x mit Zahl
			ausgabe = funktion.replace(/x/gi, i);
			// hängt berechneten Punkt an
			var1.push([i, eval(ausgabe)]);
		}

		// zeichnet Graph
		$.plot($("#graph"), [
			{
				color: "rgb(120, 120, 120)",
				data: [[xMin, 0], [xMax, 0]],
				lines: { show: true },
				shadowSize: 0
			}, {
				color: "rgb(120, 120, 120)",
				data: [[0, yMin], [0, yMax]],
				lines: { show: true },
				shadowSize: 0
			}, {
				color: "rgb(0, 0, 0)",
				data: var1,
				lines: { show: true }
			}
		], {
		xaxis: {
			min: xMin,
			max: xMax
		},
		yaxis: {
			min: yMin,
			max: yMax
		}
		});
	});
});
