@Override
	public StringBuffer getOOXML( String catAxisId, String valAxisId, String serAxisId )
	{
		StringBuffer cooxml = new StringBuffer();

		// chart type: contains chart options and series data
		cooxml.append( "<c:bar3DChart>" );
		cooxml.append( "\r\n" );
		cooxml.append( "<c:barDir val=\"bar\"/>" );
		cooxml.append( "<c:grouping val=\"" );

		if( is100PercentStacked() )
		{
			cooxml.append( "percentStacked" );
		}
		else if( isStacked() )
		{
			cooxml.append( "stacked" );
		}
		else if( cf.is3DClustered() )
		{
			cooxml.append( "clustered" );
		}
		else
		{
			cooxml.append( "standard" );
		}
		cooxml.append( "\"/>" );
		cooxml.append( "\r\n" );
		// vary colors???

		// *** Series Data:	ser, cat, val for most chart types
		cooxml.append( getParentChart().getChartSeries().getOOXML( getChartType(), false, 0 ) );

		// chart data labels, if any
		//TODO: FINISH		    	
		//cooxml.append(getDataLabelsOOXML(cf));

		if( !getChartOption( "Gap" ).equals( "150" ) )
		{
			cooxml.append( "<c:gapWidth val=\"" + getChartOption( "Gap" ) + "\"/>" );    // default= 0
		}
		int gapdepth = getGapDepth();
		if( gapdepth != 0 )
		{
			cooxml.append( "<c:gapDepth val=\"" + gapdepth + "\"/>" );
		}
		cooxml.append( "<c:shape val=\"" + getShape() + "\"/>" );

		// axis ids	 - unsigned int strings
		cooxml.append( "<c:axId val=\"" + catAxisId + "\"/>" );
		cooxml.append( "\r\n" );
		cooxml.append( "<c:axId val=\"" + valAxisId + "\"/>" );
		cooxml.append( "\r\n" );
		if( getParentChart().getAxes().hasAxis( ZAXIS ) )
		{
			cooxml.append( "<c:axId val=\"" + serAxisId + "\"/>" );
			cooxml.append( "\r\n" );
		}
		else
		{// KSC: appears to be necessary but very unclear as to why
			cooxml.append( "<c:axId val=\"0\"/>" );
			cooxml.append( "\r\n" );
		}

		cooxml.append( "</c:bar3DChart>" );
		cooxml.append( "\r\n" );

		return cooxml;
	}