fixed charts
diff --git a/charts.py b/charts.py
index d8fb73d..000a561 100644
--- a/charts.py
+++ b/charts.py
@@ -3,7 +3,7 @@
 from GChartWrapper import constants
 
 
-COLORS = ["red", "orange", "yellow", "green", "blue", "indigo", "violet"]
+COLORS = ["1569C7", "81D8D0", "307D7E", "5CB3FF", "blue", "indigo"]
 constants.MARKERS += 'E'  # append E marker to available markers
 
 
@@ -61,9 +61,10 @@
     bar.axes.type('xy')
     if scale_x:
         bar.axes.label(0, *scale_x)
-    scale_y = scale_y or range(int(max([max(l) for l in values]) + 2))
-    bar.axes.range(1, *scale_y)
 
+    max_value = (max([max(l) for l in values + deviations]))
+    bar.axes.range(1, 0, max_value)
+    bar.scale(0, max_value)
     bar.bar('r', '.1', '1')
     for i in range(len(legend)):
         bar.marker('E', '000000', '%s:%s' % ((len(values) + i*2), i),
@@ -72,14 +73,20 @@
     bar.color(*COLORS[:len(values)])
     bar.size(width, height)
 
-    return str(bar)
+    return bar
 
 
-def render_lines():
-    line = Line([])
-    line.dataset([[1,2,3], [3,2,1], [5,6,7]])
-    scale_y = range(int(max([max(l) for l in
-                             [[1,2,3], [3,2,1], [5,6,7]]]) + 2))
-    line.axes.range(1, *scale_y)
-    # G.legend('Animals','Vegetables','Minerals')
-    # G.axes('y')
+def render_lines(title, legend, dataset, scale_x, width=700, height=400):
+    line = Line([], encoding="text")
+    line.title(title)
+    line.dataset(dataset)
+
+    line.axes('xy')
+    max_value = (max([max(l) for l in dataset]))
+    line.axes.range(1, 0, max_value)
+    line.scale(0, max_value)
+    line.axes.label(0, *scale_x)
+    line.legend(*legend)
+    line.color(*COLORS[:len(legend)])
+    line.size(width, height)
+    return str(line)
diff --git a/report.py b/report.py
index dff1ed1..c36a87e 100644
--- a/report.py
+++ b/report.py
@@ -6,6 +6,23 @@
 import storage_api
 
 
+def ssize_to_kb(ssize):
+    try:
+        smap = dict(k=1, K=1, M=1024, m=1024, G=1024**2, g=1024**2)
+        for ext, coef in smap.items():
+            if ssize.endswith(ext):
+                return int(ssize[:-1]) * coef
+
+        if int(ssize) % 1024 != 0:
+            raise ValueError()
+
+        return int(ssize) / 1024
+
+    except (ValueError, TypeError, AttributeError):
+        tmpl = "Unknow size format {0!r} (or size not multiples 1024)"
+        raise ValueError(tmpl.format(ssize))
+
+
 def parse_args(argv):
     parser = argparse.ArgumentParser()
     parser.add_argument('-s', '--storage', help='storage location', dest="url")
@@ -16,15 +33,12 @@
     return parser.parse_args(argv)
 
 
-def report(url, email=None, password=None):
-    storage = storage_api.create_storage(url, email, password)
-    results = storage.recent_builds()
-
+def build_vertical_bar(results):
     data = {}
+    charts_url = []
 
-    # render vertical bar
     for build, results in results.items():
-        for key, value in results.items():
+        for key, value in results.results.items():
             keys = key.split(' ')
             if not data.get(keys[2]):
                 data[keys[2]] = {}
@@ -47,7 +61,60 @@
 
         bar = charts.render_vertical_bar(title, legend, dataset,
                                          scale_x=scale_x)
-        print "Vertical bar for %s:\n %s" % (name, str(bar))
+        charts_url.append(str(bar))
+    return charts_url
+
+
+def build_lines_chart(results):
+    data = {}
+    charts_url = []
+
+    for build, results in results.items():
+        for key, value in results.results.items():
+            keys = key.split(' ')
+            if not data.get(' '.join([keys[0], keys[1]])):
+                data[' '.join([keys[0], keys[1]])] = {}
+            if not data[' '.join([keys[0], keys[1]])].get(build):
+                data[' '.join([keys[0], keys[1]])][build] = {}
+            data[' '.join([keys[0], keys[1]])][build][keys[2]] = value
+
+    for name, value in data.items():
+        title = name
+        legend = []
+        dataset = []
+        scale_x = []
+        for build_id, build_results in value.items():
+            legend.append(build_id)
+            ordered_build_results = OrderedDict(sorted(build_results.items(),
+                                                key=lambda t: ssize_to_kb(t[0])))
+            if not scale_x:
+                scale_x = ordered_build_results.keys()
+            dataset.append(zip(*ordered_build_results.values())[0])
+
+        chart = charts.render_lines(title, legend, dataset, scale_x)
+        charts_url.append(str(chart))
+
+    return charts_url
+
+
+def render_html(charts_urls):
+    templ = open("report.html", 'r').read()
+    body = "<div><ol>%s</ol></div>"
+    li = "<li><img src='%s'></li>"
+    ol = []
+    for chart in charts_urls:
+        ol.append(li % chart)
+    html = templ % {'body': body % '\n'.join(ol)}
+    open('results.html', 'w').write(html)
+
+
+def report(url, email=None, password=None):
+    storage = storage_api.create_storage(url, email, password)
+    results = storage.recent_builds()
+    bars = build_vertical_bar(results)
+    lines = build_lines_chart(results)
+
+    render_html(bars + lines)
 
 
 def main(argv):