<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>lib/core_ext.rb</filename>
    </added>
    <added>
      <filename>lib/google_chart/linexy_chart.rb</filename>
    </added>
    <added>
      <filename>lib/google_chart/modules/axis.rb</filename>
    </added>
    <added>
      <filename>lib/google_chart/modules/color.rb</filename>
    </added>
    <added>
      <filename>lib/google_chart/modules/data_array.rb</filename>
    </added>
    <added>
      <filename>lib/google_chart/modules/fills.rb</filename>
    </added>
    <added>
      <filename>lib/google_chart/modules/grid.rb</filename>
    </added>
    <added>
      <filename>lib/google_chart/modules/label.rb</filename>
    </added>
    <added>
      <filename>lib/google_chart/modules/legend.rb</filename>
    </added>
    <added>
      <filename>lib/google_chart/modules/markers.rb</filename>
    </added>
    <added>
      <filename>lib/google_chart/radar_chart.rb</filename>
    </added>
    <added>
      <filename>lib/google_chart/scatter_plot.rb</filename>
    </added>
    <added>
      <filename>lib/google_chart/sparkline_chart.rb</filename>
    </added>
    <added>
      <filename>spec/gchartrb/axis_spec.rb</filename>
    </added>
    <added>
      <filename>spec/gchartrb/bar_chart_spec.rb</filename>
    </added>
    <added>
      <filename>spec/gchartrb/fills_spec.rb</filename>
    </added>
    <added>
      <filename>spec/gchartrb/grid_spec.rb</filename>
    </added>
    <added>
      <filename>spec/gchartrb/line_chart_spec.rb</filename>
    </added>
    <added>
      <filename>spec/gchartrb/linexy_chart_spec.rb</filename>
    </added>
    <added>
      <filename>spec/gchartrb/markers_spec.rb</filename>
    </added>
    <added>
      <filename>spec/gchartrb/pie_chart_spec.rb</filename>
    </added>
    <added>
      <filename>spec/gchartrb/radar_chart_spec.rb</filename>
    </added>
    <added>
      <filename>spec/gchartrb/scatter_plot_spec.rb</filename>
    </added>
    <added>
      <filename>spec/gchartrb/sparkline_chart_spec.rb</filename>
    </added>
    <added>
      <filename>spec/gchartrb/venn_diagram_spec.rb</filename>
    </added>
    <added>
      <filename>spec/gchartrb_spec.rb</filename>
    </added>
    <added>
      <filename>spec/helper.rb</filename>
    </added>
    <added>
      <filename>spec/spec.opts</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,2 +1,3 @@
 doc
 pkg
+coverage</diff>
      <filename>.gitignore</filename>
    </modified>
    <modified>
      <diff>@@ -4,13 +4,40 @@ Manifest.txt
 README.txt
 Rakefile
 TODO
+lib/core_ext.rb
 lib/example.rb
 lib/gchartrb.rb
 lib/google_chart.rb
 lib/google_chart/bar_chart.rb
 lib/google_chart/base.rb
 lib/google_chart/line_chart.rb
+lib/google_chart/linexy_chart.rb
+lib/google_chart/modules/axis.rb
+lib/google_chart/modules/color.rb
+lib/google_chart/modules/data_array.rb
+lib/google_chart/modules/fills.rb
+lib/google_chart/modules/grid.rb
+lib/google_chart/modules/label.rb
+lib/google_chart/modules/legend.rb
+lib/google_chart/modules/markers.rb
 lib/google_chart/pie_chart.rb
-lib/google_chart/scatter_chart.rb
+lib/google_chart/radar_chart.rb
+lib/google_chart/scatter_plot.rb
+lib/google_chart/sparkline_chart.rb
 lib/google_chart/venn_diagram.rb
 lib/test.rb
+spec/gchartrb/axis_spec.rb
+spec/gchartrb/bar_chart_spec.rb
+spec/gchartrb/fills_spec.rb
+spec/gchartrb/grid_spec.rb
+spec/gchartrb/line_chart_spec.rb
+spec/gchartrb/linexy_chart_spec.rb
+spec/gchartrb/markers_spec.rb
+spec/gchartrb/pie_chart_spec.rb
+spec/gchartrb/radar_chart_spec.rb
+spec/gchartrb/scatter_plot_spec.rb
+spec/gchartrb/sparkline_chart_spec.rb
+spec/gchartrb/venn_diagram_spec.rb
+spec/gchartrb_spec.rb
+spec/helper.rb
+spec/spec.opts</diff>
      <filename>Manifest.txt</filename>
    </modified>
    <modified>
      <diff>@@ -21,147 +21,21 @@ Visit http://code.google.com/p/gchartrb to track development regarding gchartrb.
 
 Download the latest release from http://code.google.com/p/gchartrb/downloads/list
 
-=== Subversion
-
-    svn checkout http://gchartrb.googlecode.com/svn/trunk/ gchartrb-read-only
+=== Git
+You can checkout the git repository at http://github.com/deepakjois/gchartrb
 
 == Problems/TODO
 The following features are pending :
 
 * Line Styles
 * Fill Area
+* Data Scaling for text encoding
+* Googleometer and Map Charts
 
-However, you can still make use of the API to insert arbitrary parameters
-
-    # Plotting a sparklines chart (using extra params)
-    GoogleChart::LineChart.new('100x50', nil, false) do |sparklines|
-      sparklines.data &quot;Test&quot;, [4,3,2,4,6,8,10]
-      sparklines.show_legend = false
-      sparklines.axis :x, :labels =&gt; [] # Empty labels
-      sparklines.axis :y, :labels =&gt; [] # Empty labels
-      puts sparklines.to_url(:chxs =&gt; &quot;0,000000,10,0,_|1,000000,10,0,_&quot;)
-    end
 
 == SYNOPSIS:
+TODO: write new
 
-    require 'rubygems'
-    require 'google_chart'
-
-    # Pie Chart
-    GoogleChart::PieChart.new('320x200', &quot;Pie Chart&quot;,false) do |pc|
-      pc.data &quot;Apples&quot;, 40
-      pc.data &quot;Banana&quot;, 20
-      pc.data &quot;Peach&quot;, 30
-      pc.data &quot;Orange&quot;, 60
-      puts &quot;\nPie Chart&quot;
-      puts pc.to_url
-
-      # Pie Chart with no labels
-      pc.show_labels = false
-      puts &quot;\nPie Chart (with no labels)&quot;
-      puts pc.to_url  
-    end
-
-
-    # Line Chart
-    GoogleChart::LineChart.new('320x200', &quot;Line Chart&quot;, false) do |lc|
-      lc.data &quot;Trend 1&quot;, [5,4,3,1,3,5,6], '0000ff'
-      lc.show_legend = true
-      lc.data &quot;Trend 2&quot;, [1,2,3,4,5,6], '00ff00'
-      lc.data &quot;Trend 3&quot;, [6,5,4,3,2,1], 'ff0000'
-      lc.axis :y, :range =&gt; [0,6], :color =&gt; 'ff00ff', :font_size =&gt; 16, :alignment =&gt; :center
-      lc.axis :x, :range =&gt; [0,6], :color =&gt; '00ffff', :font_size =&gt; 16, :alignment =&gt; :center
-      lc.grid :x_step =&gt; 100.0/6.0, :y_step =&gt; 100.0/6.0, :length_segment =&gt; 1, :length_blank =&gt; 0
-      puts &quot;\nLine Chart&quot;
-      puts lc.to_url
-    end
-
-    # Bar Chart
-    GoogleChart::BarChart.new('800x200', &quot;Bar Chart&quot;, :vertical, false) do |bc|
-      bc.data &quot;Trend 1&quot;, [5,4,3,1,3,5], '0000ff' 
-      bc.data &quot;Trend 2&quot;, [1,2,3,4,5,6], 'ff0000'
-      bc.data &quot;Trend 3&quot;, [6,5,4,4,5,6], '00ff00'
-      puts &quot;\nBar Chart&quot;
-      puts bc.to_url
-    end
-
-    # Line XY Chart
-    line_chart_xy = GoogleChart::LineChart.new('320x200', &quot;Line XY Chart&quot;, true) do |lcxy|
-      lcxy.data &quot;Trend 1&quot;, [[1,1], [2,2], [3,3], [4,4]], '0000ff'
-      lcxy.data &quot;Trend 2&quot;, [[4,5], [2,2], [1,1], [3,4]], '00ff00'
-      puts &quot;\nLine XY Chart (inside a block)&quot;
-      puts lcxy.to_url   
-    end
-
-    # Venn Diagram
-    # Supply three vd.data statements of label, size, color for circles A, B, C
-    # Then, an :intersections with four values:
-    # the first value specifies the area of A intersecting B
-    # the second value specifies the area of B intersecting C
-    # the third value specifies the area of C intersecting A
-    # the fourth value specifies the area of A intersecting B intersecting C
-    GoogleChart::VennDiagram.new(&quot;320x200&quot;, 'Venn Diagram') do |vd|
-      vd.data &quot;Blue&quot;, 100, '0000ff'
-      vd.data &quot;Green&quot;, 80, '00ff00'
-      vd.data &quot;Red&quot;,   60, 'ff0000'
-      vd.intersections 30,30,30,10
-      puts &quot;\nVenn Diagram&quot;
-      puts vd.to_url
-    end
-
-    # Scatter Chart
-    GoogleChart::ScatterChart.new('320x200',&quot;Scatter Chart&quot;) do |sc|
-      sc.data &quot;Scatter Set&quot;, [[1,1,], [2,2], [3,3], [4,4]]
-      sc.max_value [5,5] # Setting the max value
-      sc.axis :x, :range =&gt; [0,5]
-      sc.axis :y, :range =&gt; [0,5], :labels =&gt; [0,1,2,3,4,5]
-      sc.point_sizes [10,15,30,55] # Optional
-      puts &quot;\nScatter Chart&quot;
-      puts sc.to_url
-    end
-
-
-    GoogleChart::LineChart.new('320x200', &quot;Line Chart&quot;, false) do |lc|
-      lc.data &quot;Trend 1&quot;, [5,4,3,1,3,5,6], '0000ff'
-      lc.show_legend = true
-      lc.data &quot;Trend 2&quot;, [1,2,3,4,5,6], '00ff00'
-      lc.data &quot;Trend 3&quot;, [6,5,4,3,2,1], 'ff0000'
-      lc.axis :y, :range =&gt; [0,6], :color =&gt; 'ff00ff', :font_size =&gt; 16, :alignment =&gt; :center
-      lc.axis :x, :range =&gt; [0,6], :color =&gt; '00ffff', :font_size =&gt; 16, :alignment =&gt; :center
-      lc.grid :x_step =&gt; 100.0/6.0, :y_step =&gt; 100.0/6.0, :length_segment =&gt; 1, :length_blank =&gt; 0
-      puts &quot;\nLine Chart&quot;
-    end
-
-    # Solid fill
-    line_chart_xy.fill(:background, :solid, {:color =&gt; 'fff2cc'})
-    line_chart_xy.fill(:chart, :solid, {:color =&gt; 'ffcccc'})
-    puts &quot;\nLine Chart with Solid Fill&quot;
-    puts line_chart_xy.to_url
-
-    # Gradient fill
-    line_chart_xy.fill :background, :gradient, :angle =&gt; 0,  :color =&gt; [['76A4FB',1],['ffffff',0]]
-    line_chart_xy.fill :chart, :gradient, :angle =&gt; 0, :color =&gt; [['76A4FB',1], ['ffffff',0]]
-    puts &quot;\nLine Chart with Gradient Fill&quot;
-    puts line_chart_xy.to_url
-
-    # Stripes Fill
-    line_chart_xy.fill :chart, :stripes, :angle =&gt; 90, :color =&gt; [['76A4FB',0.2], ['ffffff',0.2]]
-    puts &quot;\nLine Chart with Stripes Fill&quot;
-    puts line_chart_xy.to_url
-
-    puts &quot;\nLine Chart with range markers and shape markers&quot;  
-    GoogleChart::LineChart.new('320x200', &quot;Line Chart&quot;, false) do |lc|
-      lc.title_color = 'ff00ff'
-      lc.data &quot;Trend 1&quot;, [5,4,3,1,3,5,6], '0000ff'
-      lc.data &quot;Trend 2&quot;, [1,2,3,4,5,6], '00ff00'
-      lc.data &quot;Trend 3&quot;, [6,5,4,3,2,1], 'ff0000'
-      lc.max_value 10 # Setting max value for simple line chart 
-      lc.range_marker :horizontal, :color =&gt; 'E5ECF9', :start_point =&gt; 0.1, :end_point =&gt; 0.5
-      lc.range_marker :vertical, :color =&gt; 'a0bae9', :start_point =&gt; 0.1, :end_point =&gt; 0.5
-      # Draw an arrow shape marker against lowest value in dataset
-      lc.shape_marker :arrow, :color =&gt; '000000', :data_set_index =&gt; 0, :data_point_index =&gt; 3, :pixel_size =&gt; 10   
-      puts lc.to_url
-    end
 == LICENSE:
 
 (The MIT License)</diff>
      <filename>README.txt</filename>
    </modified>
    <modified>
      <diff>@@ -2,13 +2,14 @@
 
 require 'rubygems'
 require 'hoe'
-require './lib/google_chart.rb'
+require &quot;spec/rake/spectask&quot;
+require './lib/gchartrb'
 
 class Hoe
   def extra_deps; @extra_deps.reject { |x| Array(x).first == &quot;hoe&quot; } end
 end # copied from the Rakefile of the sup project
 
-Hoe.new('gchartrb', &quot;0.8&quot;) do |p|
+Hoe.new('gchartrb', &quot;0.9&quot;) do |p|
   p.rubyforge_name  = 'gchartrb'
   p.author          = 'Deepak Jois'
   p.email           = 'deepak.jois@gmail.com'
@@ -40,4 +41,21 @@ Rake::RDocTask.new do |rdoc|
     	'lib/**/*.rb'
     ]
 end
+
+desc &quot;Run all specs&quot;
+Spec::Rake::SpecTask.new do |t|
+  t.spec_files = FileList[&quot;spec/**/*_spec.rb&quot;]
+  t.spec_opts = [&quot;--options&quot;, &quot;spec/spec.opts&quot;]
+end
+
+desc &quot;Run all specs and get coverage statistics&quot;
+Spec::Rake::SpecTask.new('spec:rcov') do |t|
+  t.spec_files = FileList[&quot;spec/**/*_spec.rb&quot;]
+  t.rcov = true
+  t.spec_opts = [&quot;--options&quot;, &quot;spec/spec.opts&quot;]
+end
+
+Rake::Task[:default].prerequisites.clear
+task :default =&gt; :spec
+
 # vim: syntax=Ruby</diff>
      <filename>Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,12 @@
 TODO List (Features)
 ====================
-* Update doc to indicate what function is applicable to which type of chart
-* Read through doc,do a code review(!) and make list of updated features
+* Line Styles and Fill Areas
+* Googleometer and Map Charts
+* Data Scaling for text encoding
+* Add validations for height and width values (copy specs and implementation from GChart)
+* Documentation!!!
+* Change all examples and put them in different folders
 * Download Image
 * Friendly Color Values
 * Easy calculations for Stuff that is needed
+* Cleanup and DRY validations
\ No newline at end of file</diff>
      <filename>TODO</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,13 @@
 require 'gchartrb'
 
+# BIG WARNING: Needs to be rewritten. This syntax refers to old version
+
+
 # Some examples from http://24ways.org/2007/tracking-christmas-cheer-with-google-charts
 
 # Pie Chart
 pc = GoogleChart::PieChart.new(&quot;600x300&quot;, &quot;Food and Drinks Consumed Christmas 2007&quot;)
-pc.data &quot;Egg nog&quot;, 10, '00AF33' 
+pc.data &quot;Egg nog&quot;, 10, '00AF33'
 pc.data &quot;Christmas Ham&quot;, 20, '4BB74C'
 pc.data &quot;Milk (not including egg nog)&quot;,	8, 'EE2C2C'
 pc.data &quot;Cookies&quot;, 25, 'CC3232'
@@ -16,19 +19,19 @@ pc.data &quot;Snacks&quot;,	5, 'CCFFCC'
 puts pc
 
 #  Line Chart
-x_axis_labels = (1..31).to_a.collect do |v|    
+x_axis_labels = (1..31).to_a.collect do |v|
   if [1,6,25,26,31].member?(v)
     if v == 1
       &quot;Dec 1st&quot;
     elsif v == 31
       &quot;Dec 31st&quot;
-    elsif v 
-      &quot;#{v}th&quot; 
-    end    
+    elsif v
+      &quot;#{v}th&quot;
+    end
   else
     nil
-  end  
-end 
+  end
+end
 
 y_axis_labels = (0..10).to_a.collect do |v|
   val = 10 * v</diff>
      <filename>lib/example.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1 +1 @@
-require 'google_chart'
\ No newline at end of file
+require 'google_chart'</diff>
      <filename>lib/gchartrb.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,39 @@
-%w(
-    base
-    pie_chart
-    line_chart
-    bar_chart
-    venn_diagram
-    scatter_chart     
-).each do |filename|
-    require File.dirname(__FILE__) + &quot;/google_chart/#{filename}&quot;
+require File.dirname(__FILE__) + &quot;/core_ext&quot;
+%w(legend color data_array fills axis grid markers label).each do |mod|
+    require File.dirname(__FILE__) + &quot;/google_chart/modules/#{mod}&quot;
+end
+
+%w(base line_chart linexy_chart sparkline_chart scatter_plot bar_chart radar_chart venn_diagram pie_chart).each do |type|
+    require File.dirname(__FILE__) + &quot;/google_chart/#{type}&quot;
+end
+
+module GoogleChart
+  # Blatantly copied from GChart (http://gchart.rubyforge.org)
+  URL   = &quot;http://chart.apis.google.com/chart&quot;
+
+  SIMPLE_CHARS = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a
+  EXTENDED_CHARS = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a + %w[- .]
+  EXTENDED_PAIRS = EXTENDED_CHARS.collect { |first| EXTENDED_CHARS.collect { |second| first + second } }.flatten
+  ENCODINGS = [:simple, :text, :extended]
+
+  class &lt;&lt;self
+
+    # Encode +n+ as a string. +n+ is normalized based on +max+.
+    # Blatantly copied from GChart (http://gchart.rubyforge.org)
+    def encode(encoding, n, max)
+      case encoding
+      when :simple
+        return &quot;_&quot; if n.nil?
+        SIMPLE_CHARS[((n/max.to_f) * (SIMPLE_CHARS.size - 1)).round]
+      when :text
+        return &quot;-1&quot; if n.nil?
+        ((((n/max.to_f) * 1000.0).round)/10.0).to_s
+      when :extended
+        return &quot;__&quot; if n.nil?
+        EXTENDED_PAIRS[max.zero? ? 0 : ((n/max.to_f) * (EXTENDED_PAIRS.size - 1)).round]
+      else
+        raise ArgumentError, &quot;unsupported encoding: #{encoding.inspect}&quot;
+      end
+    end
+  end
 end</diff>
      <filename>lib/google_chart.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,90 +1,83 @@
-require File.dirname(__FILE__) + '/base'
 module GoogleChart
-  # Generates a Bar Chart. You can specify the alignment(horizontal or vertical) and whether you want the bars to be grouped or stacked
-  # ==== Examples
-  #     bc = GoogleChart::BarChart.new('800x200', &quot;Bar Chart&quot;, :vertical, false)
-  #     bc.data &quot;Trend 1&quot;, [5,4,3,1,3,5], '0000ff'     
   class BarChart &lt; Base
-    
-    attr_accessor :alignment, :stacked
-    
-    # Specify the 
-    # * +chart_size+ in WIDTHxHEIGHT format
-    # * +chart_title+ as a string
-    # * +alignment+ as either &lt;tt&gt;:vertical&lt;/tt&gt; or &lt;tt&gt;:horizontal&lt;/tt&gt;
-    # * +stacked+ should be +true+ if you want the bars to be stacked, false otherwise
-    def initialize(chart_size='300x200', chart_title=nil, alignment=:vertical, stacked=false) # :yield: self
-      super(chart_size, chart_title)
-      @alignment = alignment
-      @stacked = stacked
+    include Legend
+    include Color
+    include DataArray
+    include Fills
+    include Axis
+    include Grid
+    include Markers
+
+    data_type :numeric_array
+
+    attr_accessor :orientation, :grouping, :bar_width, :bar_spacing, :group_spacing
+
+    ORIENTATIONS = [:horizontal, :vertical]
+    GROUPINGS    = [:grouped, :stacked]
+
+    def initialize(options={}) #:nodoc:
+      @orientation = :vertical
+      @grouping    = :grouped
       set_chart_type
-      self.show_legend = true
-      yield self if block_given?
+      @show_legend = false
+      super(options)
     end
-    
-    # Set the alignment to either &lt;tt&gt;:vertical&lt;/tt&gt; or &lt;tt&gt;:horizontal&lt;/tt&gt;
-    def alignment=(value)
-      @alignment = value
+
+
+    def orientation=(o)
+      raise ArgumentError.new(&quot;Orientation can only be :vertical or :horizontal&quot;) unless ORIENTATIONS.include?(o)
+      @orientation = o
       set_chart_type
     end
-    
-    # If you want the bar chart to be stacked, set the value to &lt;tt&gt;true&lt;/tt&gt;, otherwise set the value to &lt;tt&gt;false&lt;/tt&gt; to group it.
-    def stacked=(value)
-      @stacked = value
+
+    def grouping=(g)
+      raise ArgumentError.new(&quot;Grouping can only be :grouped or :stacked&quot;) unless GROUPINGS.include?(g)
+      @grouping = g
       set_chart_type
     end
 
-    # Defines options for bar width, spacing between bars and between groups of bars. Applicable for bar charts.
-    # [+options+] : Options for the style, specifying things like line thickness and lengths of the line segment and blank portions
-    #
-    # ==== Options
-    # * &lt;tt&gt;:bar_width&lt;/tt&gt;, Bar width in pixels
-    # * &lt;tt&gt;:bar_spacing&lt;/tt&gt; (optional), space between bars in a group
-    # * &lt;tt&gt;:group_spacing&lt;/tt&gt; (optional), space between groups
-    def width_spacing_options(options={})
-      options_str = &quot;#{options[:bar_width]}&quot;
-      options_str += &quot;,#{options[:bar_spacing]}&quot; if options[:bar_spacing]
-      options_str += &quot;,#{options[:group_spacing]}&quot; if options[:bar_spacing] and options[:group_spacing]
-      @bar_width_spacing_options = options_str
+    def set_chart_type
+      @chart_type = (
+                     if    @orientation == :horizontal and @grouping == :grouped then &quot;bhg&quot;
+                     elsif @orientation == :horizontal and @grouping == :stacked then &quot;bhs&quot;
+                     elsif @orientation == :vertical   and @grouping == :grouped then &quot;bvg&quot;
+                     elsif @orientation == :vertical   and @grouping == :stacked then &quot;bvs&quot;
+                     end
+                    )
     end
 
-    def process_data #:nodoc:
-      if @stacked # Special handling of max value for stacked
-        unless @max_data # Unless max_data is explicitly set
-          @max_data = @data.inject([]) do |sum_arr, series| 
-            series.each_with_index do |v,i| 
-              if sum_arr[i] == nil
-                sum_arr[i] = v
-              else
-                sum_arr[i] += v
-              end
-            end
-            sum_arr
-          end.max
-        end
-      end
+    def bar_width=(width)
+      raise ArgumentError.new(&quot;bar width should be in integer&quot;) unless width.is_a?(Integer)
+      @bar_width = width
+    end
 
-      if @data.size &gt; 1              
-        join_encoded_data(@data.collect { |series|
-                            encode_data(series, max_data_value)
-                          })
-      else
-        encode_data(@data.flatten,max_data_value)
-      end
+    def bar_spacing=(spacing)
+      raise ArgumentError.new(&quot;bar spacing should be in integer&quot;) unless spacing.is_a?(Integer)
+      raise ArgumentError.new(&quot;cannot specify bar spacing without specifying bar width first&quot;) unless @bar_width
+      @bar_spacing = spacing
     end
-    
-    private
-    def set_chart_type
-      # Set chart type
-      if alignment == :vertical and stacked == false
-        self.chart_type = :bvg
-      elsif alignment == :vertical and stacked == true
-        self.chart_type = :bvs
-      elsif alignment == :horizontal and stacked == false
-        self.chart_type = :bhg
-      elsif alignment == :horizontal and stacked == true
-        self.chart_type = :bhs
-      end          
+
+    def group_spacing=(spacing)
+      raise ArgumentError.new(&quot;bar spacing should be in integer&quot;) unless spacing.is_a?(Integer)
+      raise ArgumentError.new(&quot;cannot specify group spacing without specifying bar width first&quot;) unless @bar_width
+      raise ArgumentError.new(&quot;cannot specify group spacing without specifying bar spacing first&quot;) unless @bar_spacing
+      @group_spacing = spacing
+    end
+
+    def add_bar_width_and_spacing
+      str = &quot;#{@bar_width}&quot; if @bar_width
+      str+= &quot;,#{@bar_spacing}&quot; if @bar_spacing
+      str+= &quot;,#{@group_spacing}&quot; if @group_spacing
+      @params[:chbh] = str if str
+    end
+
+    def encode_data
+      # override encode_data to set custom max value for stacked charts (unless max is already set)
+      if grouping == :stacked and not self.max
+        # set max value to the max value of sums
+        self.max = @data.inject(Array.new(@data.first.size,0)) { |sum_series, series|  sum_series.zip(series).collect { |d| d.first + d.last } }.max
+      end
+      super
     end
   end
 end</diff>
      <filename>lib/google_chart/bar_chart.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,524 +1,112 @@
+require 'open-uri'
 require 'uri'
 
 module GoogleChart
   class Base
-    BASE_URL = &quot;http://chart.apis.google.com/chart?&quot;
-    
-    SIMPLE_ENCODING = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'.split('');
-    EXTENDED_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.'.split('');
-    EXTENDED_ENCODING = EXTENDED_CHARS.collect { |first| EXTENDED_CHARS.collect { |second| first + second } }.flatten
+    # Make new method private to avoid direct initialisation
+    class &lt;&lt;self ; private :new ; end
 
-    
-    SHAPE_MARKERS = {:arrow =&gt; &quot;a&quot;,
-      :cross =&gt; &quot;c&quot;,
-      :diamond =&gt; &quot;d&quot;,
-      :circle =&gt; &quot;o&quot;,
-      :square =&gt; &quot;s&quot;,
-      :vline_segment =&gt; &quot;v&quot;,
-      :vline_full =&gt; &quot;V&quot;,
-      :hline_full =&gt; &quot;h&quot;,
-      :x =&gt; &quot;x&quot;
-    }
+    # Wicked metaprogramming hack to :
+    # - make the new method public to enable initialisation
+    # - add a chart_type attribute to base class
+    def self.inherited(subclass) #:nodoc:
+      subclass.class_eval do
+        attr_reader :chart_type
+        class &lt;&lt;self ; public :new ; end
+      end
+    end
+
+    # Chart width, in pixels
+    attr_accessor :width
 
-    DEFAULT_LINE_STYLE = '1'
+    # Chart height, in pixels
+    attr_accessor :height
 
-    # Size of the chart in WIDTHxHEIGHT format
-    attr_accessor :chart_size 
-    
-    # Type of the chart. Usually, you do not need to set this yourself
-    attr_accessor :chart_type 
-    
     # Chart title
-    attr_accessor :chart_title
-    
-    # RRGGBB hex value for the color of the title
+    attr_accessor :title
+
+    # Chart title color (hex value)
     attr_accessor :title_color
-    
-    # Font size of the title
+
+    # Chart title font size
     attr_accessor :title_font_size
-    
-    # Data encoding to use. Can be one of &lt;tt&gt;:simple&lt;/tt&gt;, &lt;tt&gt;:text&lt;/tt&gt; or &lt;tt&gt;:extended&lt;/tt&gt; (see http://code.google.com/apis/chart/#chart_data)
-    attr_accessor :data_encoding
-    
-    # A hash of the params used to construct the URL        
-    attr_accessor :params
-    
-    # Set to &lt;tt&gt;true&lt;/tt&gt; or &lt;tt&gt;false&lt;/tt&gt; to show or hide the chart legend. Not applicable for Scatter Chart.
-    attr_accessor :show_legend
-    
-    def initialize(chart_size, chart_title)
-      self.params = Hash.new
-      @labels = []
-      @data   = []
-      @colors = []
-      @axis   = []
-      @markers = []
-      @line_styles = []
-      self.chart_size    = chart_size
-      self.chart_title   = chart_title
-      self.data_encoding = :simple
-      self.show_legend   = true
-    end
-    
-    # Generates the URL string that can be used to retrieve the graph image in PNG format.
-    # Use this after assigning all the properties to the graph
-    # You can pass in additional params as a hash for features that may not have been implemented
-    # For e.g
-    #      lc = GoogleChart::LineChart.new('320x200', &quot;Line Chart&quot;, false)
-    #      lc.data &quot;Trend 1&quot;, [5,4,3,1,3,5,6], '0000ff'
-    #      lc.data &quot;Trend 2&quot;, [1,2,3,4,5,6], '00ff00'
-    #      lc.data &quot;Trend 3&quot;, [6,5,4,3,2,1], 'ff0000'
-    #      puts lc.to_url({:chm =&gt; &quot;000000,0,0.1,0.11&quot;}) # Single black line as a horizontal marker        
-    def to_url(extras={})
-      prepare_params
-      params.merge!(extras)
-      query_string = params.map { |k,v| &quot;#{k}=#{URI.escape(v.to_s).gsub(/%20/,'+').gsub(/%7C/,'|')}&quot; }.join('&amp;')
-      BASE_URL + query_string
-    end
 
-    # Generates a fully encoded URL string that can be used to retrieve the graph image in PNG format.
-    # For less verbose URLs, use the &lt;tt&gt;to_url&lt;/tt&gt; method. Use this only if you are doing further
-    # processing with the URLs, like passing the URL to a method for downloading the images
-    #
-    # Use this after assigning all the properties to the graph
-    # You can pass in additional params as a hash for features that may not have been implemented
-    # For e.g
-    #      lc = GoogleChart::LineChart.new('320x200', &quot;Line Chart&quot;, false)
-    #      lc.data &quot;Trend 1&quot;, [5,4,3,1,3,5,6], '0000ff'
-    #      lc.data &quot;Trend 2&quot;, [1,2,3,4,5,6], '00ff00'
-    #      lc.data &quot;Trend 3&quot;, [6,5,4,3,2,1], 'ff0000'
-    #      puts lc.to_escaped_url({:chm =&gt; &quot;000000,0,0.1,0.11&quot;}) # Single black line as a horizontal marker            
-    def to_escaped_url(extras={})
-      prepare_params
-      params.merge!(extras)
-      query_string = params.map { |k,v| &quot;#{k}=#{URI.escape(v.to_s)}&quot; }.join('&amp;')
-      BASE_URL + query_string
-    end
-    
-    # Adds the data to the chart, according to the type of the graph being generated.
-    #
-    # [+name+] is a string containing a label for the data.
-    # [+value+] is either a number or an array of numbers containing the data. Pie Charts and Venn Diagrams take a single number, but other graphs require an array of numbers
-    # [+color+ (optional)] is a hexadecimal RGB value for the color to represent the data
-    # 
-    # ==== Examples
-    #
-    # for GoogleChart::LineChart (normal)
-    #    lc.data &quot;Trend 1&quot;, [1,2,3,4,5], 'ff00ff'
-    #
-    # for GoogleChart::LineChart (XY chart)
-    #    lc.data &quot;Trend 2&quot;, [[4,5], [2,2], [1,1], [3,4]], 'ff00ff'
-    #
-    # for GoogleChart::PieChart
-    #    lc.data &quot;Apples&quot;, 5, 'ff00ff'
-    #    lc.data &quot;Oranges&quot;, 7, '00ffff'
-    def data(name, value, color=nil)
-      @data &lt;&lt; value
-      @labels &lt;&lt; name
-      @colors &lt;&lt; color if color
-    end
-    
-    # Allows (optional) setting of a max value for the chart, which will be used for data encoding and axis plotting.
-    # The value to pass depends on the type of chart
-    # * For Line Chart and Bar Charts it should be a single integer or float value
-    # * For Scatter Charts and Line XY Charts, you MUST pass an array containing the maximum values for X and Y
-    # 
-    # ==== Examples
-    # For bar charts
-    #    bc.max_value 5 # 5 will be used to calculate the relative encoding values
-    # For scatter chart
-    #    sc.max_value [5,6] # 5 is the max x value and 6 is the max y value
-    #
-    # Note : MAKE SURE you are passing the right values otherwise an exception will be raised
-    def max_value(value)
-      if [:lxy, :s].member?(self.chart_type) and value.is_a?(Array)
-        @max_x = value.first
-        @max_y = value.last
-      elsif [:lc,:bhg,:bhs,:bvg,:bvs] and (value.is_a?(Integer) or value.is_a?(Float))
-        @max_data = value
-      else
-        raise &quot;Invalid max value for this chart type&quot;
-      end
-    end
-    
-    # Adds a background or chart fill. Call this option twice if you want both a background and a chart fill
-    # [+bg_or_c+] Can be one of &lt;tt&gt;:background&lt;/tt&gt; or &lt;tt&gt;:chart&lt;/tt&gt; depending on the kind of fill requested
-    # [+type+] Can be one of &lt;tt&gt;:solid&lt;/tt&gt;, &lt;tt&gt;:gradient&lt;/tt&gt; or &lt;tt&gt;:stripes&lt;/tt&gt;
-    # [+options+] : Options depend on the type of fill selected above
-    #
-    # ==== Options
-    # For &lt;tt&gt;:solid&lt;/tt&gt; type
-    # * A &lt;tt&gt;:color&lt;/tt&gt; option which specifies the RGB hex value of the color to be used as a fill. For e.g &lt;tt&gt;lc.fill(:chart, :solid, {:color =&gt; 'ffcccc'})&lt;/tt&gt;
-    #
-    # For &lt;tt&gt;:gradient&lt;/tt&gt; type
-    # * An &lt;tt&gt;:angle&lt;/tt&gt;, which is the angle of the gradient between 0(horizontal) and 90(vertical)
-    # * A &lt;tt&gt;:color&lt;/tt&gt; option which is a 2D array containing the colors and an offset each, which specifies at what point the color is pure where: 0 specifies the right-most chart position and 1 the left-most. e,g &lt;tt&gt;lc.fill :background, :gradient, :angle =&gt; 0,  :color =&gt; [['76A4FB',1],['ffffff',0]]&lt;/tt&gt;
-    # 
-    # For &lt;tt&gt;:stripes&lt;/tt&gt; type
-    # * An &lt;tt&gt;:angle&lt;/tt&gt;, which is the angle of the stripe between 0(horizontal) and 90(vertical)
-    # * A &lt;tt&gt;:color&lt;/tt&gt; option which is a 2D array containing the colors and width value each, which must be between 0 and 1 where 1 is the full width of the chart. for e.g &lt;tt&gt;lc.fill :chart, :stripes, :angle =&gt; 90, :color =&gt; [ ['76A4FB',0.2], ['ffffff',0.2] ]&lt;/tt&gt;
-    def fill(bg_or_c, type, options = {})
-      case bg_or_c
-      when :background
-        @background_fill = &quot;bg,&quot; + process_fill_options(type, options)
-      when :chart
-        @chart_fill = &quot;c,&quot; + process_fill_options(type, options)
-      end
-    end
-    
-    # Adds an axis to the graph. Not applicable for Pie Chart (GoogleChart::PieChart) or Venn Diagram (GoogleChart::VennDiagram)
-    # 
-    # [+type+] is a symbol which can be one of &lt;tt&gt;:x&lt;/tt&gt;, &lt;tt&gt;:y&lt;/tt&gt;, &lt;tt&gt;:right&lt;/tt&gt;, &lt;tt&gt;:top&lt;/tt&gt; 
-    # [+options+] is a hash containing the options (see below)
-    # 
-    # ==== Options
-    # Not all the options are mandatory.
-    # [&lt;tt&gt;:labels&lt;/tt&gt;] An array containing the labels for the axis
-    # [&lt;tt&gt;:positions&lt;/tt&gt;] An Array containing the positions for the labels
-    # [&lt;tt&gt;:range&lt;/tt&gt;] An array containing 2 elements, the start value and end value
-    # 
-    # axis styling options have to be specified as follows
-    # [&lt;tt&gt;:color&lt;/tt&gt;] Hexadecimal RGB value for the color to represent the data for the axis labels
-    # [&lt;tt&gt;:font_size&lt;/tt&gt;] Font size of the labels in pixels
-    # [&lt;tt&gt;:alignment&lt;/tt&gt;] can be one of &lt;tt&gt;:left&lt;/tt&gt;, &lt;tt&gt;:center&lt;/tt&gt; or &lt;tt&gt;:right&lt;/tt&gt;
-    # 
-    # ==== Examples
-    #     lc.axis :y, :range =&gt; [0,6], :color =&gt; 'ff00ff', :font_size =&gt; 16, :alignment =&gt; :center
-    #       
-    def axis(type, options = {})
-      raise &quot;Illegal axis type&quot; unless [:x, :y, :right, :top].member?(type)          
-      @axis &lt;&lt; [type, options]
-    end
-    
-    # Adds a grid to the graph. Applicable only for Line Chart (GoogleChart::LineChart) and Scatter Chart (GoogleChart::ScatterChart)
-    #
-    # [+options+] is a hash containing the options (see below) 
-    #
-    # === Options
-    # [&lt;tt&gt;:xstep&lt;/tt&gt;] X axis step size
-    # [&lt;tt&gt;:ystep&lt;/tt&gt;] Y axis step size
-    # [&lt;tt&gt;:length_segment&lt;/tt&gt; (optional)] Length of the line segement. Useful with the :length_blank value to have dashed lines
-    # [&lt;tt&gt;:length_blank&lt;/tt&gt; (optional)] Length of the blank segment. use 0 if you want a solid grid
-    # 
-    # === Examples
-    #     lc.grid :x_step =&gt; 5, :y_step =&gt; 5, :length_segment =&gt; 1, :length_blank =&gt; 0
-    #        
-    def grid(options={})
-      @grid_str = &quot;#{options[:x_step].to_f},#{options[:y_step].to_f}&quot;
-      if options[:length_segment] or options[:length_blank]
-        @grid_str += &quot;,#{options[:length_segment].to_f},#{options[:length_blank].to_f}&quot;
-      end
+
+    # Encoding
+    attr_accessor :encoding
+
+    # TODO write doc here
+    def initialize(options = {}, &amp;block)
+      @width    = 320
+      @height   = 200
+      @encoding = :simple
+      @data = []
+      @params = {}
+      options.each { |k, v| send(&quot;#{k}=&quot;, v) }
+      yield self if block_given?
     end
-    
-    # Defines a horizontal or vertical range marker. Applicable for line charts and vertical charts
-    #
-    # [+alignment+] can be &lt;tt&gt;:horizontal&lt;/tt&gt; or &lt;tt&gt;:vertical&lt;/tt&gt;
-    # [+options+] specifies the color, start point and end point
-    # 
-    # ==== Options
-    # [&lt;tt&gt;:color&lt;/tt&gt;] RRGGBB hex value for the color of the range marker
-    # [&lt;tt&gt;:start_point&lt;/tt&gt;]  position on the x-axis/y-axis at which the range starts where 0.00 is the left/bottom and 1.00 is the right/top
-    # [&lt;tt&gt;:end_point&lt;/tt&gt;]  position on the x-axis/y-axis at which the range ends where 0.00 is the left/bottom and 1.00 is the right/top
-    #
-    # ==== Examples
-    #     lc.range_marker :horizontal, :color =&gt; 'E5ECF9', :start_point =&gt; 0.1, :end_point =&gt; 0.5
-    #     lc.range_marker :vertical, :color =&gt; 'a0bae9', :start_point =&gt; 0.1, :end_point =&gt; 0.5
-    def range_marker(alignment, options={}) 
-      raise &quot;Invalid alignment specified&quot; unless [:horizontal, :vertical].member?(alignment)
-      str = (alignment == :horizontal ) ? &quot;r&quot; : &quot;R&quot;
-      str += &quot;,#{options[:color]},0,#{options[:start_point]},#{options[:end_point]}&quot;
-      @markers &lt;&lt; str 
+
+    def title=(title) #:nodoc:
+      @title = title.gsub(&quot;\n&quot;, &quot;|&quot;)
     end
 
-    # Defines a shape marker. Applicable for line charts and scatter plots
-    #
-    # [+type+] can be &lt;tt&gt;:arrow&lt;/tt&gt;, &lt;tt&gt;:cross&lt;/tt&gt;, &lt;tt&gt;:diamond&lt;/tt&gt;, &lt;tt&gt;:circle&lt;/tt&gt;, &lt;tt&gt;:square&lt;/tt&gt;, &lt;tt&gt;:vline_segment&lt;/tt&gt;, &lt;tt&gt;:vline_full&lt;/tt&gt;, &lt;tt&gt;:hline_full&lt;/tt&gt;, &lt;tt&gt;:x&lt;/tt&gt;
-    # [+options+] specifies the color, data set index, data point index and size in pixels
-    # 
-    # ==== Options
-    # [&lt;tt&gt;:color&lt;/tt&gt;] RRGGBB hex value for the color of the range marker
-    # [&lt;tt&gt;:data_set_index&lt;/tt&gt;]  the index of the line on which to draw the marker. This is 0 for the first data set, 1 for the second and so on.
-    # [&lt;tt&gt;:data_point_index&lt;/tt&gt;]  is a floating point value that specifies on which data point of the data set the marker will be drawn. This is 0 for the first data point, 1 for the second and so on. Specify a fraction to interpolate a marker between two points.
-    # [&lt;tt&gt;:size&lt;/tt&gt;] is the size of the marker in pixels.
-    #
-    # ==== Examples
-    #     lcxy.shape_marker :circle, :color =&gt; &quot;000000&quot;, :data_set_index =&gt; 1, :data_point_index =&gt; 2, :pixel_size =&gt; 10
-    #     lcxy.shape_marker :cross, :color =&gt; &quot;E5ECF9&quot;, :data_set_index =&gt; 0, :data_point_index =&gt; 0.5, :pixel_size =&gt; 10
-    def shape_marker(type, options={})
-      raise &quot;Invalid shape marker type specified&quot; unless SHAPE_MARKERS.has_key?(type)
-      shape_marker_str = &quot;#{SHAPE_MARKERS[type]},#{options[:color]},#{options[:data_set_index]},#{options[:data_point_index]},#{options[:pixel_size]}&quot;
-      @markers &lt;&lt; shape_marker_str
+    # Size in WIDTHxHEIGHT format
+    def size
+      &quot;#{width}x#{height}&quot;
     end
 
-    # Defines a Fill area. Applicable for line charts only
-    #
-    # [+color+] is the color of the fill area
-    # [+start_index+] is the index of the line at which the fill starts. This is 0 for the first data set, 1 for the second and so on.
-    # [+end_index+] is the index of the line at which the fill ends.
-    #
-    # ==== Examples
-    #     # Fill Area (Multiple Datasets)
-    #       lc = GoogleChart::LineChart.new('320x200', &quot;Line Chart&quot;, false) do |lc|
-    #       lc.show_legend = false
-    #       lc.data &quot;Trend 1&quot;, [5,5,6,5,5], 'ff0000'
-    #       lc.data &quot;Trend 2&quot;, [3,3,4,3,3], '00ff00'
-    #       lc.data &quot;Trend 3&quot;, [1,1,2,1,1], '0000ff'
-    #       lc.data &quot;Trend 4&quot;, [0,0,0,0,0], 'ffffff'
-    #       lc.fill_area '0000ff',2,3
-    #       lc.fill_area '00ff00',1,2
-    #       lc.fill_area 'ff0000',0,1
-    #     end
-    #     puts &quot;\nFill Area (Multiple Datasets)&quot;
-    #      puts lc.to_url
-    #
-    #     # Fill Area (Single Dataset)
-    #     lc = GoogleChart::LineChart.new('320x200', &quot;Line Chart&quot;, false) do |lc|
-    #       lc.show_legend = false
-    #       lc.data &quot;Trend 1&quot;, [5,5,6,5,5], 'ff0000'
-    #       lc.fill_area 'cc6633', 0, 0
-    #     end
-    #     puts &quot;\nFill Area (Single Dataset)&quot;
-    #     puts lc.to_url
-    #
-    def fill_area(color, start_index, end_index)
-      if (start_index == 0 and end_index == 0)
-        @markers &lt;&lt; &quot;B,#{color},0,0,0&quot;
-      else
-        @markers &lt;&lt; &quot;b,#{color},#{start_index},#{end_index},0&quot;
-      end
+    # Set the data encoding to one of :simple, :text or :extended
+    def encoding=(enc)
+      raise ArgumentError.new(&quot;unsupported encoding: #{encoding.inspect}&quot;) unless GoogleChart::ENCODINGS.include?(enc)
+      @encoding = enc
     end
-    
-    protected
 
-    def prepare_params #:nodoc:
-      params.clear
-      set_size
-      set_type
-      set_colors
-      set_fill_options
-      add_axis unless @axis.empty?
-      add_grid  
+    # Return a hash of the query params that will be converted to the URL
+    def query_params
+      @params.clear
+      add_defaults
       add_data
-      add_line_styles unless @line_styles.empty?
-      set_bar_width_spacing_options if @bar_width_spacing_options
-      add_markers unless @markers.empty?
-      add_labels(@labels) if [:p, :p3].member?(self.chart_type)
-      add_legend(@labels) if show_legend
-      add_title  if chart_title.to_s.length &gt; 0
-    end
-    
-    def process_fill_options(type, options) #:nodoc:
-      case type
-      when :solid
-        &quot;s,#{options[:color]}&quot;
-      when :gradient
-        &quot;lg,#{options[:angle]},&quot; + options[:color].collect { |o| &quot;#{o.first},#{o.last}&quot; }.join(&quot;,&quot;)
-      when :stripes
-        &quot;ls,#{options[:angle]},&quot; + options[:color].collect { |o| &quot;#{o.first},#{o.last}&quot; }.join(&quot;,&quot;)
-      end
-      
-    end
-    
-    def set_type #:nodoc:
-      params.merge!({:cht =&gt; chart_type})
-    end
-    
-    def set_size #:nodoc:
-      params.merge!({:chs =&gt; chart_size})
-    end
-    
-    def set_colors #:nodoc:
-      params.merge!({:chco =&gt; @colors.collect{|c| c.downcase}.join(&quot;,&quot;)  }) if @colors.size &gt; 0
-    end
-    
-    def set_fill_options #:nodoc:
-      fill_opt = [@background_fill, @chart_fill].compact.join(&quot;|&quot;)
-      params.merge!({:chf =&gt; fill_opt}) if fill_opt.length &gt; 0
-    end
-    
-    def add_labels(labels) #:nodoc:
-      params.merge!({:chl =&gt; labels.collect{|l| l.to_s}.join(&quot;|&quot;) }) if self.show_labels 
-    end                
-    
-    def add_legend(labels) #:nodoc:
-      params.merge!({:chdl =&gt; labels.collect{ |l| l.to_s}.join(&quot;|&quot;)})
-    end
-    
-    def add_title #:nodoc:
-      params.merge!({:chtt =&gt; chart_title})
-      params.merge!({:chts =&gt; title_color}) if title_color
-      params.merge!({:chts =&gt; &quot;#{title_color},#{title_font_size}&quot;}) if title_color and title_font_size
-    end
-    
-    def add_axis #:nodoc:
-      chxt = []
-      chxl = []
-      chxp = []
-      chxr = []                       
-      chxs = []
-      # Process params
-      @axis.each_with_index do |axis, idx|
-        # Find axis type
-        case axis.first
-        when :x then chxt &lt;&lt; &quot;x&quot;
-        when :y then chxt &lt;&lt; &quot;y&quot;
-        when :top then chxt &lt;&lt; &quot;t&quot;
-        when :right then chxt &lt;&lt; &quot;r&quot;
-        end
-        
-        # Axis labels
-        axis_opts = axis.last
-        
-        if axis_opts[:labels]
-          chxl[idx] = &quot;#{idx}:|&quot; + axis_opts[:labels].join(&quot;|&quot;)
-        end
-        
-        # Axis positions
-        if axis_opts[:positions]
-          chxp[idx] = &quot;#{idx},&quot; + axis_opts[:positions].join(&quot;,&quot;)
-        end
-        
-        # Axis range
-        if axis_opts[:range]
-          chxr[idx] = &quot;#{idx},#{axis_opts[:range].first},#{axis_opts[:range].last}&quot;                
-        end
-        
-        # Axis Styles
-        if axis_opts[:color] or axis_opts[:font_size] or axis_opts[:alignment]
-          if axis_opts[:alignment]
-            alignment = case axis_opts[:alignment]
-                        when :center then 0
-                        when :left then -1
-                        when :right then 1 
-                        else nil
-                        end
-          end
-          chxs[idx] = &quot;#{idx},&quot; + [axis_opts[:color], axis_opts[:font_size], alignment].compact.join(&quot;,&quot;)
-        end
-      end
-      
-      # Add to params hash
-      params.merge!({ :chxt =&gt; chxt.join(&quot;,&quot;) })          unless chxt.empty?
-      params.merge!({ :chxl =&gt; chxl.compact.join(&quot;|&quot;) })  unless chxl.compact.empty?
-      params.merge!({ :chxp =&gt; chxp.compact.join(&quot;|&quot;) })  unless chxp.compact.empty?
-      params.merge!({ :chxr =&gt; chxr.compact.join(&quot;|&quot;) })  unless chxr.compact.empty?
-      params.merge!({ :chxs =&gt; chxs.compact.join(&quot;|&quot;) })  unless chxs.compact.empty?
-    end
-    
-    def add_grid #:nodoc:
-      params.merge!({ :chg =&gt; @grid_str }) if @grid_str
+      add_legends if @legends and show_legend?
+      add_labels  if @labels and show_labels?
+      add_colors  if @colors
+      add_fills   if @fills
+      add_axes    if @axes
+      add_grid    if @grid
+      add_markers if @markers
+      add_bar_width_and_spacing if respond_to?(:add_bar_width_and_spacing)
+      return @params
     end
 
-    def add_line_styles #:nodoc:
-      0.upto(@line_styles.length - 1) { |i|
-        @line_styles[i] = DEFAULT_LINE_STYLE unless @line_styles[i]
-      }
-      params.merge!({:chls =&gt; @line_styles.join(&quot;|&quot;)})
+    # Returns a URL to access the chart.
+    # Use +extras+ to add more parameters that may be unsupported or impossible to construct using gchartrb
+    def to_url(extras={})
+      query = query_params.merge(extras).collect { |k, v| &quot;#{k}=#{URI.escape(v)}&quot; }.join(&quot;&amp;&quot;)
+      &quot;#{GoogleChart::URL}?#{query}&quot;
     end
 
-    def set_bar_width_spacing_options #:nodoc:
-      params.merge!({:chbh =&gt; @bar_width_spacing_options})
-    end
-    
-    def add_markers #:nodoc:
-      params.merge!({:chm =&gt; @markers.join(&quot;|&quot;)})
-    end
+    private
 
-    def add_data #:nodoc:
-      converted_data = process_data
-      case data_encoding
-      when :simple
-        converted_data = &quot;s:&quot; + converted_data
-      when :text
-        converted_data = &quot;t:&quot; + converted_data
-      when :extended
-        converted_data = &quot;e:&quot; + converted_data
-      else
-        raise &quot;Illegal Encoding Specified&quot;
-      end
-      params.merge!({:chd =&gt; converted_data})
+    def add_defaults
+      @params[:cht] = chart_type
+      @params[:chs] = size
     end
-    
-    def encode_data(values, max_value=nil) #:nodoc:
-      case data_encoding
-      when :simple
-        simple_encode(values, max_value)
-      when :text
-        text_encode(values, max_value)
-      when :extended
-        extended_encode(values, max_value)
-      else
-        raise &quot;Illegal Encoding Specified&quot;
-      end
-    end
-    
-    def simple_encode(values, max_value=nil) #:nodoc:
-      alphabet_length = 61
-      max_value = values.max unless max_value
 
-      chart_data = values.collect do |val|              
-        if val.to_i &gt;=0
-          if max_value == 0  
-            SIMPLE_ENCODING[0]
-          else
-            SIMPLE_ENCODING[(alphabet_length * val / max_value).to_i]
-          end
-        else
-          &quot;_&quot;
-        end
-      end
-      
-      return chart_data.join('')
-    end
-    
-    def text_encode(values, max_value=nil) #:nodoc:
-      max_value = values.max unless max_value
-      values.inject(&quot;&quot;) { |sum, v|
-         if max_value == 0
-          sum += &quot;0,&quot;
-        else
-          sum += ( &quot;%.1f&quot; % (v*100/max_value) ) + &quot;,&quot;
-        end
-      }.chomp(&quot;,&quot;)
-    end
-    
-    def extended_encode(values, max_value) #:nodoc:
-      max_value = values.max unless max_value
-      values.collect { |v|
-         if max_value == 0
-          EXTENDED_ENCODING[0]
-        else
-          EXTENDED_ENCODING[(v * 4095/max_value).to_i]
-        end
-      }.join('')
-    end
-    
-    def join_encoded_data(encoded_data) #:nodoc:
-      encoded_data.join((self.data_encoding == :simple or self.data_encoding == :extended) ? &quot;,&quot; : &quot;|&quot;)
-    end
-    
-    def max_data_value #:nodoc:
-      @max_data or @data.flatten.max
-    end
-    
-    def max_x_value #:nodoc:
-      @max_x or x_data.flatten.max
+    def add_data
+      sets = encode_data # calling encode data method of subclass
+      prefix = case encoding
+               when :simple then &quot;s:&quot;
+               when :text then &quot;t:&quot;
+               when :extended then &quot;e:&quot;
+               end
+      @params[:chd] = prefix + sets.join(get_series_separator)
     end
 
-    def max_y_value #:nodoc:
-      @max_y or y_data.flatten.max
+    def get_series_separator
+      encoding == :text ? &quot;|&quot; : &quot;,&quot;
     end
 
-    def x_data #:nodoc:
-      @data.collect do |series|
-        series.collect { |val| val.first }
-      end
+    def get_data_separator
+      encoding == :text ? &quot;,&quot; : &quot;&quot;
     end
-
-    def y_data #:nodoc:
-      @data.collect do |series|
-        series.collect { |val| val.last }
-      end
-    end        
   end
 end</diff>
      <filename>lib/google_chart/base.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,79 +1,19 @@
-require File.dirname(__FILE__) + '/base'
 module GoogleChart
-  
-  # Generates a Line chart. An option can be passed that allows you to create a Line XY Chart
-  #
-  # ==== Examples
-  #
-  #     # Line Chart
-  #     lc = GoogleChart::LineChart.new('320x200', &quot;Line Chart&quot;, false)
-  #     lc.data &quot;Trend 1&quot;, [5,4,3,1,3,5,6], '0000ff'
-  #     lc.data &quot;Trend 2&quot;, [1,2,3,4,5,6], '00ff00'
-  #     lc.data &quot;Trend 3&quot;, [6,5,4,3,2,1], 'ff0000'
-  #     lc.axis :y, :range =&gt; [0,6], :color =&gt; 'ff00ff', :font_size =&gt; 16, :alignment =&gt; :center
-  #     lc.axis :x, :range =&gt; [0,6], :color =&gt; '00ffff', :font_size =&gt; 16, :alignment =&gt; :center
-  #
-  #     # Line XY Chart
-  #     lcxy =  GoogleChart::LineChart.new('320x200', &quot;Line XY Chart&quot;, true)
-  #     lcxy.data &quot;Trend 1&quot;, [[1,1], [2,2], [3,3], [4,4]], '0000ff'
-  #     lcxy.data &quot;Trend 2&quot;, [[4,5], [2,2], [1,1], [3,4]], '00ff00'
-  #     puts lcxy.to_url 
   class LineChart &lt; Base
-    attr_accessor :is_xy
+    include Legend
+    include Color
+    include DataArray
+    include Fills
+    include Axis
+    include Grid
+    include Markers
 
-    # Specify the 
-    # * +chart_size+ in WIDTHxHEIGHT format
-    # * +chart_title+ as a string
-    # * +is_xy+ is &lt;tt&gt;false&lt;/tt&gt; by default. Set it to &lt;tt&gt;true&lt;/tt&gt; if you want to plot a Line XY chart
-    def initialize(chart_size='300x200', chart_title=nil, is_xy=false) # :yield: self
-      super(chart_size, chart_title)
-      self.is_xy = is_xy
-      @line_styles = []
-      yield self if block_given?
-    end
-
-    # Pass in &lt;tt&gt;true&lt;/tt&gt; here to create a Line XY.
-    #
-    # Note: This must be done before passing in any data to the chart
-    def is_xy=(value)
-      @is_xy = value
-      if value
-        self.chart_type = :lxy
-      else
-        self.chart_type = :lc
-      end
-    end
-
-    # Defines a line style. Applicable for line charts.
-    # [+data_set_index+] Can be one of &lt;tt&gt;:background&lt;/tt&gt; or &lt;tt&gt;:chart&lt;/tt&gt; depending on the kind of fill requested
-    # [+options+] : Options for the style, specifying things like line thickness and lengths of the line segment and blank portions
-    #
-    # ==== Options
-    # * &lt;tt&gt;:line_thickness&lt;/tt&gt; (mandatory) option which specifies the thickness of the line segment in pixels
-    # * &lt;tt&gt;:length_segment&lt;/tt&gt;, which specifies the length of the line segment
-    # * &lt;tt&gt;:length_blank&lt;/tt&gt;, which specifies the lenght of the blank segment
-    def line_style(data_set_index, options={})
-      @line_styles[data_set_index] = &quot;#{options[:line_thickness]}&quot;
-      @line_styles[data_set_index] += &quot;,#{options[:length_segment]},#{options[:length_blank]}&quot; if options[:length_segment]
-    end
+    data_type :numeric_array
 
-    def process_data #:nodoc:
-      if self.is_xy or @data.size &gt; 1
-        if self.is_xy # XY Line graph data series
-          encoded_data = []
-          @data.size.times { |i|
-            # Interleave X and Y co-ordinate data
-            encoded_data &lt;&lt; join_encoded_data([encode_data(x_data[i],max_x_value), encode_data(y_data[i],max_y_value)])
-          }
-          join_encoded_data(encoded_data)
-        else # Line graph multiple data series          
-          join_encoded_data(@data.collect { |series|
-                              encode_data(series, max_data_value)
-                            })
-        end
-      else
-        encode_data(@data.flatten, max_data_value)
-      end
+    def initialize(options={})
+      @chart_type = &quot;lc&quot;
+      @show_legend = false
+      super(options)
     end
   end
 end</diff>
      <filename>lib/google_chart/line_chart.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,33 +1,44 @@
-require File.dirname(__FILE__) + '/base'
 module GoogleChart
     class PieChart &lt; Base
-        
-        # set to &lt;tt&gt;true&lt;/tt&gt; or &lt;tt&gt;false&lt;/tt&gt; to indicate if this is a 3d chart
-        attr_accessor :is_3d
-        
-        # set to &lt;tt&gt;true&lt;/tt&gt; or &lt;tt&gt;false&lt;/tt&gt; to show or hide pie chart labels
-        attr_accessor :show_labels
+      include Fills
+      include Color
+      include DataArray
+      include Label
 
-        # Initializes a Pie Chart object with a +chart_size+ and +chart_title+. Specify &lt;tt&gt;is_3d&lt;/tt&gt; as +true+ to generate a 3D Pie chart
-        def initialize(chart_size='300x200', chart_title=nil, is_3d = false) # :yield: self
-            super(chart_size, chart_title)
-            self.is_3d = is_3d
-            self.show_legend = false
-            self.show_labels = true
-            yield self if block_given?
-        end
+      data_type :numeric
 
-        # Set this value to &lt;tt&gt;true&lt;/tt&gt; if you want the Pie Chart to be rendered as a 3D image
-        def is_3d=(value)
-            if value
-                self.chart_type = :p3
-            else
-                self.chart_type = :p
-            end
-        end
+      attr_accessor :is_3d
+
+      def initialize(options={})
+        @is_3d = false
+        set_chart_type
+        @label ||=
+        @show_labels = true
+        super(options)
+      end
 
-        def process_data #:nodoc:
-            encode_data(@data, max_data_value)
+      def is_3d=(three_d)
+        @is_3d = three_d
+        set_chart_type
+      end
+
+      def is_3d?
+        self.is_3d
+      end
+
+      def set_chart_type
+        if is_3d?
+          @chart_type = &quot;p3&quot;
+        else
+          @chart_type = &quot;p&quot;
         end
+      end
+
+      def data(label,data,color=nil)
+        raise ArgumentError.new(&quot;data should be an integer value&quot;) unless data.is_a?(Numeric)
+        @data &lt;&lt; data
+        label(label)
+        color(color)
+      end
     end
-end
\ No newline at end of file
+end</diff>
      <filename>lib/google_chart/pie_chart.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,36 +1,41 @@
-require File.dirname(__FILE__) + '/base'
 module GoogleChart
-    # Generates a Venn Diagram.
-    #        
-    # Supply three vd.data statements of label, size, color for circles A, B, C. Then, intersections with four values:
-    # * the first value specifies the area of A intersecting B
-    # * the second value specifies the area of B intersecting C
-    # * the third value specifies the area of C intersecting A
-    # * the fourth value specifies the area of A intersecting B intersecting C
-    #
-    #      vd = GoogleChart::VennDiagram.new(&quot;320x200&quot;, 'Venn Diagram') 
-    #      vd.data &quot;Blue&quot;, 100, '0000ff'
-    #      vd.data &quot;Green&quot;, 80, '00ff00'
-    #      vd.data &quot;Red&quot;,   60, 'ff0000'
-    #      vd.intersections 30,30,30,10
-    #      puts vd.to_url  
+
     class VennDiagram &lt; Base
-      
-        # Initializes the Venn Diagram with a +chart_size+ (in WIDTHxHEIGHT format) and a +chart_title+
-        def initialize(chart_size='300x200', chart_title=nil) # :yield: self
-            super(chart_size, chart_title)
-            self.chart_type = :v
-            @intersections = []
-            yield self if block_given? 
+      include Legend
+      include Fills
+      include Color
+      include DataArray
+
+      data_type :numeric
+
+        def initialize(options={})
+          @chart_type=&quot;v&quot;
+          @show_legend = false
+          @intersections = []
+          super(options)
         end
-                  
+
         # Specify the intersections of the circles in the Venn Diagram. See the Rdoc for class for sample
-        def intersections(*values)            
+        def intersections(*values)
+          raise ArgumentError.new(&quot;Please intialise the data first before adding intersections&quot;) if @data.empty?
+          raise ArgumentError.new(&quot;You can have at most three intersections&quot;) if values.size &gt; 3
+          raise ArgumentError.new(&quot;You cannot have more intersections than data points&quot;) if values.size &gt; @data.size
+          raise ArgumentError.new(&quot;all values must be integers&quot;) unless values.all? { |v| v.is_a?(Integer) }
           @intersections = values
         end
-        
-        def process_data #:nodoc:
-          encode_data(@data + @intersections)
-        end        
+
+        def data(legend, data, color = nil)
+          raise ArgumentError.new(&quot;data should be an integer value&quot;) unless data.is_a?(Integer)
+          raise ArgumentError.new(&quot;you can only insert upto 3 data points&quot;) if @data.size == 3
+          @data &lt;&lt; data
+          legend(legend)
+          color(color)
+        end
+        private
+        def encode_data
+          @data.push(0) until @data.size == 3
+          @data = @data + @intersections unless @intersections.empty?
+          super
+        end
     end
-end
\ No newline at end of file
+end</diff>
      <filename>lib/google_chart/venn_diagram.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,7 @@
 require 'gchartrb'
 
+# BIG WARNING: Needs to be rewritten. This syntax refers to old version
+
 # Pie Chart
 GoogleChart::PieChart.new('320x200', &quot;Pie Chart&quot;,false) do |pc|
   pc.data &quot;Apples&quot;, 40
@@ -8,11 +10,11 @@ GoogleChart::PieChart.new('320x200', &quot;Pie Chart&quot;,false) do |pc|
   pc.data &quot;Orange&quot;, 60
   puts &quot;\nPie Chart&quot;
   puts pc.to_url
-  
+
   # Pie Chart with no labels
   pc.show_labels = false
   puts &quot;\nPie Chart (with no labels)&quot;
-  puts pc.to_url  
+  puts pc.to_url
 end
 
 
@@ -31,7 +33,7 @@ end
 
 # Bar Chart
 GoogleChart::BarChart.new('800x200', &quot;Bar Chart&quot;, :vertical, false) do |bc|
-  bc.data &quot;Trend 1&quot;, [5,4,3,1,3,5], '0000ff' 
+  bc.data &quot;Trend 1&quot;, [5,4,3,1,3,5], '0000ff'
   bc.data &quot;Trend 2&quot;, [1,2,3,4,5,6], 'ff0000'
   bc.data &quot;Trend 3&quot;, [6,5,4,4,5,6], '00ff00'
   bc.width_spacing_options :bar_width =&gt; 5, :bar_spacing =&gt; 2, :group_spacing =&gt; 10
@@ -44,7 +46,7 @@ line_chart_xy = GoogleChart::LineChart.new('320x200', &quot;Line XY Chart&quot;, true) do
   lcxy.data &quot;Trend 1&quot;, [[1,1], [2,2], [3,3], [4,4]], '0000ff'
   lcxy.data &quot;Trend 2&quot;, [[4,5], [2,2], [1,1], [3,4]], '00ff00'
   puts &quot;\nLine XY Chart (inside a block)&quot;
-  puts lcxy.to_url   
+  puts lcxy.to_url
 end
 
 # Venn Diagram
@@ -105,17 +107,17 @@ puts &quot;\nLine Chart with Stripes Fill&quot;
 puts line_chart_xy.to_url
 
 # Range and Shape Markers
-puts &quot;\nLine Chart with range markers and shape markers&quot;  
+puts &quot;\nLine Chart with range markers and shape markers&quot;
 GoogleChart::LineChart.new('320x200', &quot;Line Chart&quot;, false) do |lc|
   lc.title_color = 'ff00ff'
   lc.data &quot;Trend 1&quot;, [5,4,3,1,3,5,6], '0000ff'
   lc.data &quot;Trend 2&quot;, [1,2,3,4,5,6], '00ff00'
   lc.data &quot;Trend 3&quot;, [6,5,4,3,2,1], 'ff0000'
-  lc.max_value 10 # Setting max value for simple line chart 
+  lc.max_value 10 # Setting max value for simple line chart
   lc.range_marker :horizontal, :color =&gt; 'E5ECF9', :start_point =&gt; 0.1, :end_point =&gt; 0.5
   lc.range_marker :vertical, :color =&gt; 'a0bae9', :start_point =&gt; 0.1, :end_point =&gt; 0.5
   # Draw an arrow shape marker against lowest value in dataset
-  lc.shape_marker :arrow, :color =&gt; '000000', :data_set_index =&gt; 0, :data_point_index =&gt; 3, :pixel_size =&gt; 10   
+  lc.shape_marker :arrow, :color =&gt; '000000', :data_set_index =&gt; 0, :data_point_index =&gt; 3, :pixel_size =&gt; 10
   puts lc.to_url
 end
 
@@ -131,7 +133,7 @@ puts lcxy.to_url
 # Stacked Chart error
 stacked = GoogleChart::BarChart.new('320x200', &quot;Stacked Chart&quot;, :vertical, true)
 stacked.data_encoding = :text
-stacked.data &quot;Trend 1&quot;, [60,80,20], '0000ff' 
+stacked.data &quot;Trend 1&quot;, [60,80,20], '0000ff'
 stacked.data &quot;Trend 2&quot;, [50,5,100], 'ff0000'
 stacked.axis :y, :range =&gt; [0,120]
 stacked.title_color='ff0000'
@@ -142,12 +144,12 @@ puts stacked.to_url
 # Encoding Error (Bar Chart)
 bc = GoogleChart::BarChart.new('800x350', nil, :vertical, true) do |chart|
   chart.data_encoding = :extended
-      
+
   chart.data &quot;2^i&quot;, (0..8).to_a.collect{|i| 2**i}, &quot;ff0000&quot;
   chart.data &quot;2.1^i&quot;, (0..8).to_a.collect{|i| 2.1**i}, &quot;00ff00&quot;
   chart.data &quot;2.2^i&quot;, (0..8).to_a.collect{|i| 2.2**i}, &quot;0000ff&quot;
   max = 2.2**8
-      
+
   chart.show_legend = true
   chart.axis :y, :range =&gt; [0,max], :font_size =&gt; 16, :alignment =&gt; :center
   chart.axis :x, :labels =&gt; (0..8).to_a, :font_size =&gt; 16, :alignment =&gt; :center</diff>
      <filename>lib/test.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>lib/google_chart/scatter_chart.rb</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>fc554fb28acd7fac2f85d89eb344e19ba73ee097</id>
    </parent>
  </parents>
  <author>
    <name>Deepak Jois</name>
    <email>deepak.jois@gmail.com</email>
  </author>
  <url>http://github.com/deepakjois/gchartrb/commit/a6b4fb7c155a5b59549ca649818131b41487d4cc</url>
  <id>a6b4fb7c155a5b59549ca649818131b41487d4cc</id>
  <committed-date>2008-05-16T06:56:06-07:00</committed-date>
  <authored-date>2008-05-16T06:56:06-07:00</authored-date>
  <message>Squashed commit of the following:

commit 6ed09869d8aa25b30c9385f9c5e8101dbc014849
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Fri May 16 21:52:28 2008 +0800

    pie chart implementation and other cleanups

commit 451200d7f78fa98cabe616e91084ac6c523af973
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Thu May 15 23:59:03 2008 +0800

    partial pie chart implementation

commit a963f3b31181b969b545f22c40ec035ee3ca0d92
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Thu May 15 22:49:12 2008 +0800

    Adding Venn Diagram Implementation

commit 4a82d23aac050de1eb89ce8e8d4d2acae190c6b3
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Thu May 15 21:32:17 2008 +0800

    misc cleanups

commit 3e597cc719afde016eb80ba6dd1c576474533290
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Thu May 15 21:29:19 2008 +0800

    more encoding bugs

commit 42d16805d4d62629ef443c1cecf5468cfc0b81da
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Thu May 15 20:55:58 2008 +0800

    minor bug in encoding

commit f92afd16f01d3d44ed09b34849653e28210f087b
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Thu May 15 20:45:05 2008 +0800

    data encoding fixes for stacked bar chart

commit 842f501c5d7cae0a1a93ca99a743d228eb1e2007
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Thu May 15 19:51:29 2008 +0800

    major refactoring to the encoding of data

commit 3c4a50d61b2680646126442108ab77e1ffac26df
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Thu May 15 18:58:23 2008 +0800

    Radar chart implementation

commit 25dc69be2708334a32224ed15ffb134039e89998
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Wed May 14 18:03:33 2008 +0800

    Adding bar width and spacing features with spec

commit f121b8df5a3db9d31a1bca51f143a5a23d4b8b2a
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Tue May 13 22:03:40 2008 +0800

    more specs for marker.

commit e4d3597092c6a8f3ca376cc985c0b9223b93fdc9
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Mon May 12 23:21:10 2008 +0800

    more markers

commit 73b63f83485ed401631e9703086c08ca2b522340
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Sat May 10 23:31:34 2008 +0800

    more specs more implementation

commit d1447a0e530a238e8151df4a3b58dca4b6899a30
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Sat May 10 19:38:53 2008 +0800

    Axis specs implementation

commit 493cc515fb18ef192a7d68565e43f377d122141d
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Sat May 10 12:17:52 2008 +0800

    whitespace changes

commit d9b8b5e28cda705962d978974ba19b3283ad2599
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Sat May 10 12:00:58 2008 +0800

    more specs coverage

commit 791ccdfad18293c5456f346017cfbe8ce1c90298
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Sat May 10 00:47:18 2008 +0800

    More specs more code

commit 350c03acdd40298413a69f303c84cbce0da14b98
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Fri May 9 22:55:39 2008 +0800

    Some random changes

commit 4b15755ec3e71746d02ae364c2a212b7574e6d3b
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Fri May 9 22:39:04 2008 +0800

    More tests, more evil metaprogramming. Probably overdoing it

commit d73b52c08910ca0be7a7429a30638c8eda501a60
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Fri May 9 15:38:15 2008 +0800

    Added TODO

commit c6f3b7932b4d1349e64f6bdc0b88d33c0b37b1d3
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Fri May 9 15:35:42 2008 +0800

    Evil metaprogramming using ruby module callback hooks

commit ec1285a2872d9721cfd92f75e846c4d3e1174608
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Fri May 9 15:29:41 2008 +0800

    Added basic line XY chart specs

commit cac17b029f166bdbc0d73b16cca2af8ef44488d8
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Fri May 9 15:05:36 2008 +0800

    Adding more simple tests

commit 700561e122c7222637ac82d23daba83077f8cc27
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Fri May 9 00:39:24 2008 +0800

    Just made a simple Line Chart spec pass

commit a2b981a63f6c090b1c61e380293d4afc24c6a6c7
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Thu May 8 22:11:15 2008 +0800

    Some basic spec based implementation. Long way to go

commit 93fa0eb21dfe10bd3264bc359b12a9eb71d4ff93
Author: Deepak Jois &lt;deepak.jois@gmail.com&gt;
Date:   Thu May 8 17:33:14 2008 +0800

    Adding specs to start rewrite</message>
  <tree>8f2fac322eb2887e3994c1e1c834f5d3d21cf0f0</tree>
  <committer>
    <name>Deepak Jois</name>
    <email>deepak.jois@gmail.com</email>
  </committer>
</commit>
