		// Graph Library v 0.5 developed by JMS for FORK Unstable Media 2010-10-10
		
		// Graph Library Globals
		var graph_avaiable = false;
		var graph_patterns_preloaded = 0;
		var graph_pattern_images = [];
		//mdelonge: changed for link management in WCMS
		var graph_pattern_path = [
		                          /*certain superbrains begin counting with 1 ...*/"avoid oboe",
		                          /*VIPURL*/"/deg/Vorlagen/graphs/patterns/pattern1.gif",
		                          /*VIPURL*/"/deg/Vorlagen/graphs/patterns/pattern2.gif",
		                          /*VIPURL*/"/deg/Vorlagen/graphs/patterns/pattern3.gif",
		                          /*VIPURL*/"/deg/Vorlagen/graphs/patterns/pattern4.gif",
		                          /*VIPURL*/"/deg/Vorlagen/graphs/patterns/pattern5.gif",
		                          /*VIPURL*/"/deg/Vorlagen/graphs/patterns/pattern6.gif"
		                         ];
		var graph_pattern_count = 6;
		var graph_canvas_compatmode = false;
		var graph_language = "de";
	
		// Graph Library Init
		function graphs_init() {
		
			//try and create sample canvas element  
			var test_canvas = document.createElement("canvas") ;
				
			//check if object supports getContext() method, a method of the canvas element  
			var canvas_check=(test_canvas.getContext)? true : false;
				
			// Skip the iPad - currently no Text rendering support, also skip IE
			if(navigator.userAgent.match(/iPad/i) ) {
				canvas_check = false;
			}
			
			// Determine language
			var metas = document.getElementsByTagName('meta');
			for(var i=0; i<metas.length; i++) {
				if(metas[i].httpEquiv == "content-language" && metas[i].content == "en") {
					graph_language = "en";
				}
			}
			
			if (canvas_check) {
				for(var i=1;i<=graph_pattern_count;i++) {
					graph_pattern_images[i] = new Image();
					graph_pattern_images[i].onload = graph_load_complete;
					graph_pattern_images[i].src = graph_pattern_path[i];				
				}
			} else if ( navigator.userAgent.match(/MSIE/i) ) {
				graph_canvas_compatmode = true;
				graphs_initialized();								
			}
		}
		
		// OnLoad for Pattern Images
		function graph_load_complete() {
			
			graph_patterns_preloaded++;
			if (graph_patterns_preloaded == graph_pattern_count) {
				graphs_initialized();
			}
		}
		
		// This function is called after Graph library has been loaded
		function graphs_initialized() {
			var divs = document.getElementsByTagName('table');
			for(var i=0; i<divs.length; i++) {
				var cn = divs[i].className;
				if (cn == "graphs_bargraph") { graphs_bargraph(divs[i]); i--; }
				if (cn == "graphs_piegraph") { graphs_piegraph(divs[i]); i--; }
				if (cn == "graphs_packed_bargraph") { graphs_packed_bargraph(divs[i]); i--; }
				if (cn == "graphs_stacked_bargraph") { graphs_stacked_bargraph(divs[i]); i--; }
				if (cn == "graphs_dotgraph") { graphs_dotgraph(divs[i]); i--; }
			}
	
		}
		
		// Create Scale
		function graphs_find_scale(a,b,max_steps) {
			var step = 1;
			
			while((b-a)/step > max_steps) {
				step*=5;
				if ((b-a)/step <= max_steps) break;
				step*=2;
			}
			
			a = Math.ceil(a/step)*step;
			b = Math.floor(b/step)*step;
			
			return Array(a,b,step);
			
		}
		
		// Draws Dot Graph
		function graphs_dotgraph(div_object) {
			
			// Analyze Source Data
			var at = graphs_analyze_table(div_object);
			var values = at[0];
			var rows = at[1];
			var cells = at[2];
			var float_values = at[3];
			var overall_max = at[4];
			var col1_min = at[7];
			var col1_max = at[8];
			
			// Quit if values out of range
			if (overall_max < 1 || rows < 2 || cells < 2 || cells > 6 || rows > 50) return;
			
			// Define Canavs dimensions
			var width=540;
			var height=320;
			
			// Define Chart Dimensions
			var base_left = 90;
			var base_width = 400;
			var base_top = 260;
			var base_height = 190;
			var text_y = 280;
			var dot_radius = 4;
			var base_margin = 10;
			
			// Init Canvas
			var ctx = graphs_build_canvas(div_object,width,height);
			
			// Light Border
			ctx.strokeStyle = '#d4d9db';
			ctx.lineWidth = 1;
			ctx.fillStyle   = '#434343';
			ctx.font         = '14px Trebuchet MS';
			
			// Vertical Scale
			ctx.textAlign    = 'right';
			vscale = graphs_find_scale(0,overall_max,9);
			for (var vp=vscale[0];vp<=vscale[1];vp+=vscale[2]) {
				var y = base_top-Math.round(vp*base_height/overall_max);
				ctx.beginPath();
				ctx.moveTo(base_left-base_margin,y+0.5);
				ctx.lineTo(base_left+base_width+base_margin,y+0.5);
				ctx.stroke();
				ctx.fillText(vp,base_left-base_margin-8,y);
				
			}
			
			// Horizontal Scale
			ctx.textAlign    = 'center';
			hscale = graphs_find_scale(col1_min,col1_max,10);
			for (var hp=hscale[0];hp<=hscale[1];hp+=hscale[2]) {
				var x = Math.round((hp-col1_min)*base_width/(col1_max-col1_min)+base_left);
				ctx.beginPath();
				ctx.moveTo(x+0.5,base_top-base_height-base_margin);
				ctx.lineTo(x+0.5,base_top+base_margin);
				ctx.stroke();
				ctx.fillText(hp,x,base_top+base_margin+15);
			}
			
			// Outer Border
			ctx.strokeStyle = '#6d7781';
			ctx.lineWidth = 2;
			
			// Coordinate System
			ctx.beginPath();
			ctx.moveTo(base_left-base_margin,base_top-base_height-base_margin);
			ctx.lineTo(base_left-base_margin,base_top+base_margin);
			ctx.lineTo(base_left+base_width+base_margin,base_top+base_margin);
			ctx.stroke();
			
			
			// Loop through Columns
			for (var col=0; col<rows-1; col++) {
				
				
									
				// Loop through cells
				for (var cell=cells-2; cell>=0; cell--) {
					
					// Get Bar Dimensions
					x = Math.round((float_values[(col+1)+':0']-col1_min)*base_width/(col1_max-col1_min)+base_left);
					y = base_top-Math.round(float_values[(col+1)+':'+(cell+1)]*base_height/overall_max);
					
					// Draw and Frame Bar
					ctx.beginPath(); 
					graphs_set_pattern(cell,ctx);
					ctx.arc(x,y,dot_radius,0,Math.PI*2, false);  
					ctx.fill();
					ctx.stroke();
				}

				// Description
				/*
				var x = Math.round(base_left+col*column_width+column_width/2);
				ctx.fillStyle   = '#434343';
				ctx.font         = '14px Trebuchet MS';
				ctx.textAlign    = 'center';
				ctx.fillText(values[(col+1)+':0'],x,text_y);
				*/
			}
			
			
			// Paint Legend
			var legend_width = Math.round((width-40)/(cells-1));
			ctx.fillStyle   = '#434343';
			ctx.font         = '14px Trebuchet MS';
			ctx.textAlign    = 'right';
			var text_y = 29;
			var text_offset = -25;
			
			for (cell=0; cell<cells-1; cell++) {
				x = 10+cell*legend_width;
				y = 30;
				
				// Draw Sample
				ctx.beginPath(); 
				graphs_set_pattern(cell,ctx);
				ctx.arc(x+legend_width-10,y,dot_radius,0,Math.PI*2, false);  
				ctx.fill();
				ctx.stroke();
				
				// Draw Label
				ctx.fillStyle   = '#434343';
				ctx.fillText(values['0:'+(cell+1)],x+legend_width+text_offset,text_y,legend_width);
			}
			
			// Vertical Text
			ctx.fillStyle   = '#434343';
			ctx.font         = '12px Trebuchet MS';
			ctx.textAlign    = 'left';
			ctx.rotate(-Math.PI/2);
			ctx.fillText(values['0:0'],-base_top,16);
			
		}
		
		// Draws packed Bars
		function graphs_packed_bargraph(div_object) {
		
			// Analyze Source Data
			var at = graphs_analyze_table(div_object);
			var values = at[0];
			var rows = at[1];
			var cells = at[2];
			var float_values = at[3];
			var overall_max = at[4];
			
			
			// Quit if values out of range
			if (overall_max < 1 || rows < 2 || cells < 2 || cells > 6 || rows > 11) return;
			
			// Define Canavs dimensions
			var width=540;
			var height=320;
			
			// Define Chart Dimensions
			var base_left = 60;
			var base_width = 440;
			var base_top = 265;
			var base_height = 200;
			var column_width = base_width / (rows-1);
			var bar_width = 26;
			var text_y = 280;
			
			// Init Canvas
			var ctx = graphs_build_canvas(div_object,width,height);
			
			// Light Border
			ctx.strokeStyle = '#d4d9db';
			ctx.lineWidth = 1;
			ctx.fillStyle   = '#434343';
			ctx.font         = '14px Trebuchet MS';
			
			// Vertical Scale
			ctx.textAlign    = 'right';
			vscale = graphs_find_scale(0,overall_max,9);
			for (var vp=vscale[0];vp<=vscale[1];vp+=vscale[2]) {
				var y = base_top-Math.round(vp*base_height/overall_max);
				ctx.fillText(vp,base_left-8,y);
				
			}
							
			// Outer Border
			ctx.strokeStyle = '#6d7781';
			ctx.lineWidth = 2;
			
			// Coordinate System
			ctx.beginPath();
			ctx.moveTo(base_left,base_top-base_height);
			ctx.lineTo(base_left,base_top+1);
			ctx.lineTo(base_left+base_width,base_top+1);
			ctx.stroke();
			
			// Loop through Columns
			for (var col=0; col<rows-1; col++) {
				
				
									
				// Loop through cells
				for (var cell=cells-2; cell>=0; cell--) {
					
					// Get Bar Dimensions
					var x = Math.round(base_left+col*column_width+column_width/2)+(cell-(cells-2)/2)*8;
					var height = Math.round(float_values[(col+1)+':'+(cell+1)]*base_height/overall_max);
					var y = base_top-height;
					
					// Draw and Frame Bar
					graphs_set_pattern(cell,ctx);
					ctx.fillRect(x-bar_width/2,y,bar_width,height);
					ctx.strokeRect(x-bar_width/2,y+1,bar_width,height);
				}

				// Description
				var x = Math.round(base_left+col*column_width+column_width/2);
				ctx.fillStyle   = '#434343';
				ctx.font         = '14px Trebuchet MS';
				ctx.textAlign    = 'center';
				ctx.fillText(values[(col+1)+':0'],x,text_y);
			}
			
			
			// Paint Legend
			var box_width = 20;
			var legend_width = Math.round((width-40)/(cells-1));
			ctx.fillStyle   = '#434343';
			ctx.font         = '14px Trebuchet MS';
			ctx.textAlign    = 'right';
			var text_y = 29;
			var text_offset = -18;
			
			for (cell=0; cell<cells-1; cell++) {
				x = 10+cell*legend_width;
				y = 20;
				
				// Draw Sample
				graphs_set_pattern(cell,ctx);
				ctx.fillRect(x+legend_width-10,y,box_width,box_width);
				ctx.strokeRect(x+legend_width-10,y,box_width,box_width);
				
				// Draw Label
				ctx.fillStyle   = '#434343';
				ctx.fillText(values['0:'+(cell+1)],x+legend_width+text_offset,text_y,legend_width);
			}
			
			// Vertical Text
			ctx.fillStyle   = '#434343';
			ctx.font         = '12px Trebuchet MS';
			ctx.textAlign    = 'left';
			ctx.rotate(-Math.PI/2);
			ctx.fillText(values['0:0'],-base_top,16);
		}
		
		
		// Draws stacked Bars
		function graphs_stacked_bargraph(div_object) {
					
			// Analyze Source Data
			var at = graphs_analyze_table(div_object);
			var values = at[0];
			var rows = at[1];
			var cells = at[2];
			var float_values = at[3];
			var overall_max = at[4];
			var cell_sum_max = at[6];
			
			// Quit if values out of range
			if (cell_sum_max < 1 || rows < 2 || cells < 2 || cells > 6 || rows > 11) return;
			
			// Define Canavs dimensions
			var width=540;
			var height=320;
			
			// Define Chart Dimensions
			var base_left = 50;
			var base_width = 440;
			var base_top = 265;
			var base_height = 200;
			var column_width = base_width / (rows-1);
			var bar_width = 26;
			var text_y = 280;
			
			// Init Canvas
			var ctx = graphs_build_canvas(div_object,width,height);
			
			// Outer Border
			ctx.strokeStyle = '#6d7781';
			ctx.lineWidth = 2;
			
			// Loop through Columns
			for (var col=0; col<rows-1; col++) {
				var x = Math.round(base_left+col*column_width+column_width/2);
				var y = base_top;
									
				// Loop through cells
				for (var cell=0; cell<cells-1; cell++) {
					
					// Get Bar Dimensions
					var height = Math.round(float_values[(col+1)+':'+(cell+1)]*base_height/cell_sum_max);
					y -= height;
					
					// Draw and Frame Bar
					graphs_set_pattern(cell,ctx);
					ctx.fillRect(x-bar_width/2,y,bar_width,height);
					ctx.strokeRect(x-bar_width/2,y+1,bar_width,height);
				}

				// Description
				ctx.fillStyle   = '#434343';
				ctx.font         = '14px Trebuchet MS';
				ctx.textAlign    = 'center';
				ctx.fillText(values[(col+1)+':0'],x,text_y);
			}
			
			// Paint Legend
			var box_width = 20;
			var legend_width = Math.round((width-40)/(cells-1));
			ctx.fillStyle   = '#434343';
			ctx.font         = '14px Trebuchet MS';
			ctx.textAlign    = 'right';
			var text_y = 29;
			var text_offset = -18;
			
			for (cell=0; cell<cells-1; cell++) {
				x = 10+cell*legend_width;
				y = 20;
				
				// Draw Sample
				graphs_set_pattern(cell,ctx);
				ctx.fillRect(x+legend_width-10,y,box_width,box_width);
				ctx.strokeRect(x+legend_width-10,y,box_width,box_width);
				
				// Draw Label
				ctx.fillStyle   = '#434343';
				ctx.fillText(values['0:'+(cell+1)],x+legend_width+text_offset,text_y,legend_width);
			}
			
			// Vertical Text
			ctx.fillStyle   = '#434343';
			ctx.font         = '12px Trebuchet MS';
			ctx.textAlign    = 'left';
			ctx.rotate(-Math.PI/2);
			ctx.fillText(values['0:0'],-base_top,16);
		}
		
		
		// Draw Simple Bargraph
		function graphs_bargraph(div_object) {
			
			// Analyze Source Data
			var at = graphs_analyze_table(div_object);
			
			var values = at[0];
			var rows = at[1];
			var cells = at[2];
			var float_values = at[3];
			var overall_max = at[4];
			
			// Quit if values out of range
			if (overall_max < 1 || rows < 1 || cells < 2 || rows > 50) return;
							
			// Define Canavs dimensions								
			var width=540;
			var height=50+rows*29+(rows-1)*14;
			
			// Define Chart Dimensions
			var text_left = 20;
			var text_width = 215;
			var graph_left = 250;
			var line_pitch = 14+29;
			var bar_height=29;
			var graph_width = 150;
			
			// Init Canvas
			var ctx = graphs_build_canvas(div_object,width,height);
		

			// Iterate Rows
			for (var row=0;row<rows;row++) {			
				var y = 25+row*line_pitch;
			
				// Description
				ctx.fillStyle   = '#434343';
				ctx.font         = '14px Trebuchet MS';
				ctx.textAlign    = 'right';
				ctx.fillText(values[row+':0'],text_left+text_width,y+bar_height/2, text_width);
				
				// Bar
				var bar_width = graph_width * float_values[row+':1'] / overall_max;
				ctx.fillStyle   = '#6d7781';
				ctx.fillRect  (graph_left,  y, bar_width, bar_height);
				
				// Value
				ctx.fillStyle   = '#434343';
				ctx.font         = '18px Trebuchet MS';
				ctx.textAlign    = 'left';
				ctx.fillText(values[row+':1'],graph_left+10+bar_width,y+bar_height/2);

			}
			
			
			
		}
		
		// Mmmmmh... Pie
		function graphs_piegraph(div_object) {
			
			
			var at = graphs_analyze_table(div_object);
			var values = at[0];
			var rows = at[1];
			var cells = at[2];
			var float_values = at[3];
			var overall_max = at[4];
			var col_sums = at[5];
		
			// Analyze Source Data			
			var width=540;
			var height=320;
			
			// Init Canvas
			var ctx = graphs_build_canvas(div_object,width,height);
			
			var cx = 160;
			var cy = 160;
			var cr = 100;
			
			var apos = -Math.PI/2;
			
			for (var row=0;row<rows;row++) {
			
				graphs_set_pattern(row,ctx);
				
				var awidth= float_values[row+':1'] * 2 * Math.PI / col_sums[1];
			
				ctx.beginPath();

				var cx1 = cx;
				var cy1 = cy;
				
				ctx.moveTo(cx1,cy1);
				ctx.arc(cx1,cy1 ,cr, apos, apos+awidth, false);
				ctx.lineTo(cx1,cy1);
				
				
				apos+=awidth;
		     
				ctx.fill();
				
				if (awidth < 0.8) {
					var tr = 120;
				} else {
					var tr = 65;
				}
				
				var tx = cx1 + tr*Math.cos(apos-awidth/2);
				var ty = cy1 + tr*Math.sin(apos-awidth/2);
				ctx.fillStyle   = '#434343';
				if (awidth < 0.4) {
					ctx.font         = '12px Trebuchet MS';
				} else {
					ctx.font         = '15px Trebuchet MS';
				}
				if (awidth >= 0.8 && row%2 == 0) {
					ctx.fillStyle   = '#fff';
				}
				ctx.textAlign    = 'center';
				ctx.fillText(values[row+':1'],tx,ty);
				
			}
			
			ctx.strokeStyle   = '#eef1f1';
			ctx.lineWidth = 2;
			var apos = -Math.PI/2;
			
			for (var row=0;row<rows;row++) {

				var awidth= float_values[row+':1'] * 2 * Math.PI / col_sums[1];
			
				ctx.beginPath();
				
				var cx1 = cx;
				var cy1 = cy;
				
				ctx.moveTo(cx1,cy1);
				ctx.arc(cx1,cy1 ,cr, apos, apos+awidth, false);
				ctx.lineTo(cx1,cy1);
				
				
				apos+=awidth;
		     
				ctx.stroke();
			}
			
			var box_left = 440;
			var text_width = 100;
			var box_size = 20;
			var line_height = 30;
			if (rows > 9) line_height = 22;
			
			for (var row=0;row<rows;row++) {
				var box_y = height/2+(row-rows/2)*line_height;
				
				graphs_set_pattern(row,ctx);
				ctx.fillRect(box_left,box_y,box_size,box_size);
				
				// Description
				ctx.fillStyle   = '#434343';
				ctx.font         = '14px Trebuchet MS';
				ctx.textAlign    = 'right';
				ctx.fillText(values[row+':0'],box_left-10,box_y+10, text_width);
			}
				
			
		}
		
		// Set Fill to one of eight patterns
		function graphs_set_pattern(pattern,ctx) {
			var p = pattern%8;
			
			var cols = Array('#6d7781','#d5dbdd','#bb5d02','#ffffff','#333333','#e5e5e5','#51585f','#c9d1d3');
			
			if (p < 2 || graph_canvas_compatmode) {	
				ctx.fillStyle = cols[p];
			} else {
				var objPattern = ctx.createPattern(graph_pattern_images[p-1], "repeat");
				ctx.fillStyle = objPattern;
				
			}
		
		}
		
		// Init Canvas Element
		function graphs_build_canvas(div_object,width,height) {
			
			// Initialize Canvas Object
			var canvas_object  = document.createElement('canvas'); 
			canvas_object.height=height; 
			canvas_object.width=width; 
			
			// document.getElementById(div_object.id).appendChild(canvas_object); 
			// Replace Table object with Canvas Object
			div_object.parentNode.replaceChild(canvas_object,div_object);
			
			// Start up Flash Canvas
			if (typeof FlashCanvas != "undefined") {
			    FlashCanvas.initElement(canvas_object);
			}

			// Create Context
			var ctx = canvas_object.getContext("2d");
								
			// Background
			ctx.fillStyle   = '#eef1f1'; 
			ctx.fillRect  (0,0,width,height);
			
			// Copyright
			ctx.fillStyle   = '#434343'; // Both Bars and Text
			ctx.textAlign    = 'right';
			ctx.font         = '12px Trebuchet MS';
			ctx.textBaseline = 'middle';
			ctx.fillText("© KfW 2010",width-10,height-14);
			
			return ctx;
		}
		
		
		// Find first real child node
		function graphs_find_child_node(object) {
			var cn = object.childNodes;
			if (!cn) return null;
			var ln = cn.length;
			
			for (i=0;i<ln;i++) {
				if (cn[i].nodeType == 1) {
					return object.childNodes[i];
				}
			}
			return null;
		}

		// Turn String into Float		
		function graphs_parse_float(s) {
		 	
			if (graph_language == "de") {
				// Dot goes away, comma becomes dot
				s = s.replace(/\./gi, "");
				s = s.replace(/\,/gi, ".");
			} else {
				// Comma goes away
				s = s.replace(/\,/gi, "");
			}

			// Parse Float
			value =	parseFloat(s);
		
			// Kill NaNs and negative values
			if (isNaN(value)) value = 0;
			if (value < 0) value = 0;
			
			return value;
		}
		
		// Analyze HTML Table for Values
		function graphs_analyze_table(table_object) {

			var values = [];
			var float_values = [];
			var overall_max = 0;
			var col_sums = [];
			var cell_sums = [];
			var cell_sum_max = 0;
			var col1_max = 0;
			var col1_min = 99999999999;
		
			// var table_object = graphs_find_child_node(div_object);
			// if (table_object === null) return;

			var help_object = graphs_find_child_node(table_object);
			if (help_object === null) return;
			
			var row_objects = help_object.childNodes;				
			var rows = row_objects.length;
			var row_pos = 0;
			
			for (var i=0;i<rows;i++) {
				var node_type = row_objects[i].nodeType;
				if (node_type == 1) {
				
					var cell_objects = row_objects[i].childNodes;
					var cells = cell_objects.length;
					
					var cell_pos = 0;
					
					for (var j=0;j<cells;j++) {
						var sub_node_type = cell_objects[j].nodeType;
						
						
						
						if (sub_node_type == 1) {
							var s = cell_objects[j].innerHTML;
							values[row_pos+':'+cell_pos] = s;
							var value = graphs_parse_float(s);
							
							float_values[row_pos+':'+cell_pos] = value;
							
							if (cell_pos > 0) {
								overall_max = Math.max(value,overall_max);
							}
							
							
							
							if (i == 0) {
								col_sums[cell_pos] = value;
								
							} else {
								col_sums[cell_pos] += value;
								
							}
							
							if (cell_pos == 0) {
								cell_sums[row_pos] = 0;
							} else {							
								cell_sums[row_pos] += value;
								cell_sum_max = Math.max(cell_sum_max,cell_sums[row_pos]);
							}
							
							if (cell_pos == 0 && value > 0) {
								col1_min = Math.min(col1_min,value);
								col1_max = Math.max(col1_max,value);
							}
							
							cell_pos++;
						}
					
					}
					
					row_pos++;
					
				}
			}
			
			var rows = row_pos;
			var cells = cell_pos;
			
			return Array(values,rows,cells,float_values,overall_max,col_sums,cell_sum_max,col1_min,col1_max);
		
			
		}	
