jui.define("chart.brush.circle", ["util.base"], function(_) {

    /**
     * @class chart.brush.circle
     * @extends chart.brush.core
     */
	var CircleBrush = function(chart, axis, brush) {
        var group;
        var w, centerX, centerY, outerRadius;


        this.circle = function (opt, per, angle) {
            var options = _.extend({ r : 10 , cx : 10, cy : 10,  'stroke-width' : 1, fill : 'transparent' }, opt);

            var strokeDashArray = 2 * Math.PI * options.r;
            var line = strokeDashArray * (per || 1);
            angle = angle || 0;


            options['stroke-dasharray'] = [line, strokeDashArray - line].join(" ");
            return this.svg.circle(options).rotate(angle, opt.cx, opt.cy);
        }

        this.drawUnit = function(i, data) {
            var obj = axis.c(i),
                value = this.getValue(data, "value", 0),
                max = this.getValue(data, "max", 100),
                min = this.getValue(data, "min", 0);

            var rate = (value - min) / (max - min),
                width = obj.width,
                height = obj.height,
                x = obj.x,
                y = obj.y;

            // center
            w = Math.min(width, height) / 2;
            centerX = width / 2 + x;
            centerY = height / 2 + y;
            outerRadius = w;

            var r = outerRadius - this.brush.externalSize/2;

            var color = this.color(i);

            // 위에 껍데기
            group.append(this.circle({
                cx : centerX,
                cy : centerY,
                r : r,
                stroke : color,
                "stroke-width" : this.brush.externalSize
            }));


            // gauge
            r -= this.brush.dist*2 + this.brush.size/2;
            group.append(this.circle({
                cx : centerX,
                cy : centerY,
                r : r ,
                stroke : color,
                "stroke-width" : this.brush.size
            }, rate, -90 + this.brush.rotate));

            r += this.brush.size/6;

            // gauge background
            group.append(this.circle({
                cx : centerX,
                cy : centerY,
                r : r,
                stroke : color,
                "stroke-width" : 2
            }));

            var fontSize = r;

            group.append(this.chart.text(_.extend({
                x : centerX,
                y : centerY,
                fill : color,
                'font-size' : fontSize,
                'text-anchor' : 'middle',
                'alignment-baseline' : 'central'
            }), value));

        };
        
		this.draw = function() {
            group = chart.svg.group();

            this.eachData(function(data, i) {
                this.drawUnit(i, data);
            });

            return group;
		}
	}

    CircleBrush.setup = function() {
        return {
            /** @cfg {Boolean} [clip=false] If the brush is drawn outside of the chart, cut the area. */
            clip: false,

            /** @cfg {Number} [size=1] set gauge stroke width  */
            size : 20,

            /** @cfg {Number} [dist=2] set dist between circle and gauge  */
            dist : 2,

            /** @cfg {Number} [externalSize=1] set circle stroke width   */
            externalSize : 4,

            /** @cfg {Number} [rotate=0] set rotate to gauge   */
            rotate : 0,
        }
    }

	return CircleBrush;
}, "chart.brush.core");