/**

* Pie charts
*/

$.fn.sparkline.pie = pie = createClass($.fn.sparkline._base, {

type: 'pie',

init: function (el, values, options, width, height) {
    var total = 0, i;

    pie._super.init.call(this, el, values, options, width, height);

    this.shapes = {}; // map shape ids to value offsets
    this.valueShapes = {}; // maps value offsets to shape ids
    this.values = values = $.map(values, Number);

    if (options.get('width') === 'auto') {
        this.width = this.height;
    }

    if (values.length > 0) {
        for (i = values.length; i--;) {
            total += values[i];
        }
    }
    this.total = total;
    this.initTarget();
    this.radius = Math.floor(Math.min(this.canvasWidth, this.canvasHeight) / 2);
},

getRegion: function (el, x, y) {
    var shapeid = this.target.getShapeAt(el, x, y);
    return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined;
},

getCurrentRegionFields: function () {
    var currentRegion = this.currentRegion;
    return {
        isNull: this.values[currentRegion] === undefined,
        value: this.values[currentRegion],
        percent: this.values[currentRegion] / this.total * 100,
        color: this.options.get('sliceColors')[currentRegion % this.options.get('sliceColors').length],
        offset: currentRegion
    };
},

changeHighlight: function (highlight) {
    var currentRegion = this.currentRegion,
         newslice = this.renderSlice(currentRegion, highlight),
         shapeid = this.valueShapes[currentRegion];
    delete this.shapes[shapeid];
    this.target.replaceWithShape(shapeid, newslice);
    this.valueShapes[currentRegion] = newslice.id;
    this.shapes[newslice.id] = currentRegion;
},

renderSlice: function (valuenum, highlight) {
    var target = this.target,
        options = this.options,
        radius = this.radius,
        borderWidth = options.get('borderWidth'),
        offset = options.get('offset'),
        circle = 2 * Math.PI,
        values = this.values,
        total = this.total,
        next = offset ? (2*Math.PI)*(offset/360) : 0,
        start, end, i, vlen, color;

    vlen = values.length;
    for (i = 0; i < vlen; i++) {
        start = next;
        end = next;
        if (total > 0) {  // avoid divide by zero
            end = next + (circle * (values[i] / total));
        }
        if (valuenum === i) {
            color = options.get('sliceColors')[i % options.get('sliceColors').length];
            if (highlight) {
                color = this.calcHighlightColor(color, options);
            }

            return target.drawPieSlice(radius, radius, radius - borderWidth, start, end, undefined, color);
        }
        next = end;
    }
},

render: function () {
    var target = this.target,
        values = this.values,
        options = this.options,
        radius = this.radius,
        borderWidth = options.get('borderWidth'),
        shape, i;

    if (!pie._super.render.call(this)) {
        return;
    }
    if (borderWidth) {
        target.drawCircle(radius, radius, Math.floor(radius - (borderWidth / 2)),
            options.get('borderColor'), undefined, borderWidth).append();
    }
    for (i = values.length; i--;) {
        if (values[i]) { // don't render zero values
            shape = this.renderSlice(i).append();
            this.valueShapes[i] = shape.id; // store just the shapeid
            this.shapes[shape.id] = i;
        }
    }
    target.render();
}

});