	
		/**
		*   zeros()
		*	@param <int> o ... Zeilen
		*	@param <int> p ... Spalten
		* 	@return <Array> A 
		*	@description Erzeugt eine Matrix A(o,p), 
		*				 die mit Nullen gefüllt ist
		*
		**/			
		Math.zeros = function(o,p) {
			var A = new Array(o);
			for (var i=0; i<o; i++) {
				A[i] = new Array(p);
				for (var j=0; j<p; j++)
					A[i][j]=0.0;
			}
			return A;
		}

		/**
		*   trans()
		*	@param <Array> A
		* 	@return <Array> AT 
		*	@description Transponiert eine Matrix A
		*				 und gibt diese (AT) zurück
		*
		**/				
		Math.trans = function(A) {
			var AT = Math.zeros(A[0].length, A.length);
			for (var i=0; i<A.length; i++) 
				for (var j=0; j<A[i].length; j++) 
					AT[j][i] = A[i][j];	
			return AT;
		}
		
		/**
		*   multi()
		*	@param <Array> A1
		*	@param <Array> A2
		* 	@return <Array> R = A1*A2 
		*	@description Multipliziert zwei Matrizen A1(o,p), A2(l,k) 
		*				 und gibt das Produkt R(p,l) zurück
		*			 	 
		**/				
		Math.multi = function (A1, A2){
			if (A1[0].length == A2.length){
				var R = Math.zeros(A1.length,A2[0].length); 
				for (var i=0; i<A1.length; i++){
					for (var j=0; j<A2[0].length; j++){
						R[i][j] = 0.0;
						for (var k=0; k<A1[0].length; k++)
							R[i][j] += A1[i][k] * A2[k][j];
					}		
				}
				return R;
			}
			return null;

		}
		
		/**
		*   diag()
		*	@param <Vector> v
		* 	@return <Array> diag(v) 
		*	@description liefert eine quadratische Matrix, deren Hauptdiagonale v ist
		*			 	 
		**/				
		Math.diag = function (v){
			var V = Math.zeros(v.length,v.length);
			for (var i=0; i<v.length; i++)
				V[i][i] = v[i];
			return V;
		}		
				
		function FFGPolarPoint() {
			this.parameterTable = null;
			this.resultTable = null;
			this.calcButton = null;
			this.parameters = new Array();
			this.RHO = Math.PI / 200.0;
			
			this.init = function() {
				if (!document.getElementById || !document.createElement ||
						(this.parameterTable = document.getElementById("polarCoordsParameters")) == null || 
						(this.resultTable = document.getElementById("polarCoordsResult")) == null)
					return false;
				
				this.replaceElement();
				this.parameters = this.parameterTable.getElementsByTagName("input");
				this.initButton();
				return true;
			}
			
			this.initButton = function() {
				this.calcButton = this.createInputElement("Berechnen", "button");
				var self = this;
				this.calcButton.onclick = function(e) {
					self.calculate();
				};
				document.getElementById("calcButton").appendChild( this.calcButton );
			}
			
			this.replaceElement = function() {
				var codeEl = this.parameterTable.getElementsByTagName("code");

				while (codeEl.length > 0) {
					var value  = codeEl[0].firstChild.nodeValue;
					var parent = codeEl[0].parentNode;
					parent.replaceChild(this.createInputElement(value, "text"), codeEl[0]); 
					parent.style.textAlign = "left";
				}
			}
			
			this.getPropagationOfUncertainty = function(A, Cxx) {
				return Math.multi(A, Math.multi(Cxx, Math.trans(A)));
			}
			
			this.createInputElement = function(value, type) {
				var el = document.createElement("input");
				el.type = type;
				el.value = value;
			
				return el;
			}
			
			this.showResult = function(xn, yn, zn, sx, sy, sz) {
				var tds = this.resultTable.getElementsByTagName("td");
				tds[0].firstChild.nodeValue = xn.toFixed(5);
				tds[1].firstChild.nodeValue = sx.toFixed(5);
				
				tds[2].firstChild.nodeValue = yn.toFixed(5);
				tds[3].firstChild.nodeValue = sy.toFixed(5);
				
				tds[4].firstChild.nodeValue = zn.toFixed(5);
				tds[5].firstChild.nodeValue = sz.toFixed(5);
			}
			
			this.calculate = function() {

				if (this.parameters == null || this.parameters.length != 29) 
					return;
					
				var X0 = parseFloat(this.parameters[ 0].value); //100.0;
				var Y0 = parseFloat(this.parameters[ 2].value); //200.0;
				var Z0 = parseFloat(this.parameters[ 4].value); // 50.0;
				
				var ih = parseFloat(this.parameters[ 6].value); // 1.65;
				var th = parseFloat(this.parameters[ 8].value); // 1.30;
				
				var s =  parseFloat(this.parameters[10].value); // 25.0;
				
				var r =  parseFloat(this.parameters[13].value); // 50.0;
				var z =  parseFloat(this.parameters[15].value); // 85.0;
				
				var c =  parseFloat(this.parameters[17].value); // 0.002;
				var i =  parseFloat(this.parameters[19].value); //-0.004;
				
				var k =  parseFloat(this.parameters[21].value); // 0.003;
				var a =  parseFloat(this.parameters[23].value); //-0.034;
				var d =  parseFloat(this.parameters[25].value); //-0.0011;
				var b =  parseFloat(this.parameters[27].value); // 0.0;
                                   
				var sX0 = parseFloat(this.parameters[ 1].value); //0.002;
				var sY0 = parseFloat(this.parameters[ 3].value); //0.002;
				var sZ0 = parseFloat(this.parameters[ 5].value); //0.002;
                                     
				var sih = parseFloat(this.parameters[ 7].value); //0.001;
				var sth = parseFloat(this.parameters[ 9].value); //0.001;
                                     
				var s_c = parseFloat(this.parameters[11].value); //0.002;
				var s_v = parseFloat(this.parameters[12].value)/1.0E6; //0.000002;
                        
				var sr =  parseFloat(this.parameters[14].value); // 0.0003;
				var sz =  parseFloat(this.parameters[16].value); // 0.0003;
						
				var sc =  parseFloat(this.parameters[18].value); // 0.0003;
				var si =  parseFloat(this.parameters[20].value); // 0.0003;
				var sk =  parseFloat(this.parameters[22].value); // 0.0003;
				var sa =  parseFloat(this.parameters[24].value); // 0.0010;
				var sd =  parseFloat(this.parameters[26].value); // 0.0002;
				var sb =  parseFloat(this.parameters[28].value); // 0.0005;

				var ss = Math.sqrt(Math.pow(s_c,2) + Math.pow(s*s_v,2));

				// Umrechnungn von GRAD->RAD

				sr *= this.RHO;
				sz *= this.RHO;
				sc *= this.RHO;
				si *= this.RHO;
				sk *= this.RHO;
				sd *= this.RHO;
				c  *= this.RHO;
				i  *= this.RHO;
				k  *= this.RHO;
				d  *= this.RHO;
				z  *= this.RHO;
				r  *= this.RHO;

				// Ableitungen
				var dXX0 =1.0;
				var dXY0 =0.0;
				var dYZ0 =0.0;
				var dXih =0.0;
				var dXth =0.0;
				var dXs = -Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(c/Math.pow(Math.sin(z+k+d+b/(s+a)),2)*Math.cos(z+k+d+b/(s+a))*b/Math.pow(s+a,2)-i*(-1.0-1.0/Math.pow(Math.tan(z+k+d+b/(s+a)),2))*b/Math.pow(s+a,2))*(s+a)*Math.sin(z+k+d+b/(s+a))+Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*Math.sin(z+k+d+b/(s+a))-Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)/(s+a)*Math.cos(z+k+d+b/(s+a))*b;
				var dXr = -Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(s+a)*Math.sin(z+k+d+b/(s+a));
				var dXz = -Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(-c/Math.pow(Math.sin(z+k+d+b/(s+a)),2)*Math.cos(z+k+d+b/(s+a))+i*(-1.0-1.0/Math.pow(Math.tan(z+k+d+b/(s+a)),2)))*(s+a)*Math.sin(z+k+d+b/(s+a))+Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(s+a)*Math.cos(z+k+d+b/(s+a));
				var dXc = -Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(s+a);
				var dXi = -Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*1.0/Math.tan(z+k+d+b/(s+a))*(s+a)*Math.sin(z+k+d+b/(s+a));
				var dXk = -Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(-c/Math.pow(Math.sin(z+k+d+b/(s+a)),2)*Math.cos(z+k+d+b/(s+a))+i*(-1.0-1.0/Math.pow(Math.tan(z+k+d+b/(s+a)),2)))*(s+a)*Math.sin(z+k+d+b/(s+a))+Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(s+a)*Math.cos(z+k+d+b/(s+a));
				var dXa = -Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(c/Math.pow(Math.sin(z+k+d+b/(s+a)),2)*Math.cos(z+k+d+b/(s+a))*b/Math.pow(s+a,2)-i*(-1.0-1.0/Math.pow(Math.tan(z+k+d+b/(s+a)),2))*b/Math.pow(s+a,2))*(s+a)*Math.sin(z+k+d+b/(s+a))+Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*Math.sin(z+k+d+b/(s+a))-Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)/(s+a)*Math.cos(z+k+d+b/(s+a))*b;
				var dXd = -Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(-c/Math.pow(Math.sin(z+k+d+b/(s+a)),2)*Math.cos(z+k+d+b/(s+a))+i*(-1.0-1.0/Math.pow(Math.tan(z+k+d+b/(s+a)),2))+1.0)*(s+a)*Math.sin(z+k+d+b/(s+a))+Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(s+a)*Math.cos(z+k+d+b/(s+a));
				var dXb = -Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(-c/Math.pow(Math.sin(z+k+d+b/(s+a)),2)*Math.cos(z+k+d+b/(s+a))/(s+a)+i*(-1.0-1.0/Math.pow(Math.tan(z+k+d+b/(s+a)),2))/(s+a))*(s+a)*Math.sin(z+k+d+b/(s+a))+Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*Math.cos(z+k+d+b/(s+a));
 

				var dYX0 =0.0;
				var dYY0 =1.0;
				var dYZ0 =0.0;
				var dYih =0.0;
				var dYth =0.0;
				var dYs = Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(c/Math.pow(Math.sin(z+k+d+b/(s+a)),2)*Math.cos(z+k+d+b/(s+a))*b/Math.pow(s+a,2)-i*(-1.0-1.0/Math.pow(Math.tan(z+k+d+b/(s+a)),2))*b/Math.pow(s+a,2))*(s+a)*Math.sin(z+k+d+b/(s+a))+Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*Math.sin(z+k+d+b/(s+a))-Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)/(s+a)*Math.cos(z+k+d+b/(s+a))*b;
				var dYr = Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(s+a)*Math.sin(z+k+d+b/(s+a));
				var dYz = Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(-c/Math.pow(Math.sin(z+k+d+b/(s+a)),2)*Math.cos(z+k+d+b/(s+a))+i*(-1.0-1.0/Math.pow(Math.tan(z+k+d+b/(s+a)),2)))*(s+a)*Math.sin(z+k+d+b/(s+a))+Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(s+a)*Math.cos(z+k+d+b/(s+a));
				var dYc = Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(s+a);
				var dYi = Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*1.0/Math.tan(z+k+d+b/(s+a))*(s+a)*Math.sin(z+k+d+b/(s+a));
				var dYk = Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(-c/Math.pow(Math.sin(z+k+d+b/(s+a)),2)*Math.cos(z+k+d+b/(s+a))+i*(-1.0-1.0/Math.pow(Math.tan(z+k+d+b/(s+a)),2)))*(s+a)*Math.sin(z+k+d+b/(s+a))+Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(s+a)*Math.cos(z+k+d+b/(s+a));
				var dYa = Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(c/Math.pow(Math.sin(z+k+d+b/(s+a)),2)*Math.cos(z+k+d+b/(s+a))*b/Math.pow(s+a,2)-i*(-1.0-1.0/Math.pow(Math.tan(z+k+d+b/(s+a)),2))*b/Math.pow(s+a,2))*(s+a)*Math.sin(z+k+d+b/(s+a))+Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*Math.sin(z+k+d+b/(s+a))-Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)/(s+a)*Math.cos(z+k+d+b/(s+a))*b;
				var dYd = Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(-c/Math.pow(Math.sin(z+k+d+b/(s+a)),2)*Math.cos(z+k+d+b/(s+a))+i*(-1.0-1.0/Math.pow(Math.tan(z+k+d+b/(s+a)),2))+1.0)*(s+a)*Math.sin(z+k+d+b/(s+a))+Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(s+a)*Math.cos(z+k+d+b/(s+a));
				var dYb = Math.cos(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*(-c/Math.pow(Math.sin(z+k+d+b/(s+a)),2)*Math.cos(z+k+d+b/(s+a))/(s+a)+i*(-1.0-1.0/Math.pow(Math.tan(z+k+d+b/(s+a)),2))/(s+a))*(s+a)*Math.sin(z+k+d+b/(s+a))+Math.sin(r+c/Math.sin(z+k+d+b/(s+a))+i*1.0/Math.tan(z+k+d+b/(s+a))+d)*Math.cos(z+k+d+b/(s+a));
 
			
				var dZX0 = 0.0;
				var dZY0 = 0.0;
				var dZZ0 = 1.0;
				var dZih = 1.0;
				var dZth =-1.0;
				var dZs = Math.cos(z+k+d+b/(s+a))+1.0/(s+a)*Math.sin(z+k+d+b/(s+a))*b;
				var dZr = 0.0;
				var dZz = -(s+a)*Math.sin(z+k+d+b/(s+a));
				var dZc = 0.0;
				var dZi = 0.0;
				var dZk = -(s+a)*Math.sin(z+k+d+b/(s+a));
				var dZa = Math.cos(z+k+d+b/(s+a))+1.0/(s+a)*Math.sin(z+k+d+b/(s+a))*b;
				var dZd = -(s+a)*Math.sin(z+k+d+b/(s+a));
				var dZb = -Math.sin(z+k+d+b/(s+a));

				var A = [[dXX0, dXY0, dYZ0, dXih, dXth, dXs, dXr, dXz, dXc, dXi, dXk, dXa, dXd, dXb], [dYX0, dYY0, dYZ0, dYih, dYth, dYs, dYr, dYz, dYc, dYi, dYk, dYa, dYd, dYd], [dZX0, dZY0, dZZ0, dZih, dZth, dZs, dZr, dZz, dZc, dZi, dZk, dZa, dZd, dZd]];
				var Cxx = Math.diag( [sX0*sX0, sY0*sY0, sZ0*sZ0, sih*sih, sth*sth, ss*ss, sr*sr, sz*sz, sc*sc, si*si, sk*sk, sa*sa, sd*sd, sb*sb] );

				var Cyy = this.getPropagationOfUncertainty(A,Cxx);		
			
				var XN = X0+Math.cos(r+c/Math.sin(z+k+d + b/(s+a) )+i*1.0/Math.tan(z+k+d + b/(s+a))+d)*(s+a)*Math.sin(z+k+d + b/(s+a));
				var YN = Y0+Math.sin(r+c/Math.sin(z+k+d + b/(s+a) )+i*1.0/Math.tan(z+k+d + b/(s+a))+d)*(s+a)*Math.sin(z+k+d + b/(s+a));
				var ZN = Z0+ih-th+(s+a)*Math.cos(z+k+d + b/(s+a));

				this.showResult(
						XN,
						YN,
						ZN,
						Math.sqrt(Cyy[0][0]),
						Math.sqrt(Cyy[1][1]),
						Math.sqrt(Cyy[2][2])
				);
			}
		}