tooltip.js 65.5 KB
Newer Older
K
kener 已提交
1 2 3 4 5 6 7 8
/**
 * echarts组件:提示框
 *
 * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。
 * @author Kener (@Kener-林峰, linzhifeng@baidu.com)
 *
 */
define(function (require) {
K
kener 已提交
9 10 11
    var Base = require('./base');
    
    // 图形依赖
K
kener 已提交
12 13
    var LineShape = require('zrender/shape/Line');
    var RectangleShape = require('zrender/shape/Rectangle');
K
kener 已提交
14
    var rectangleInstance = new RectangleShape({});
K
kener 已提交
15
    
K
kener 已提交
16 17 18 19 20 21 22 23 24
    var ecConfig = require('../config');
    var ecData = require('../util/ecData');
    var zrConfig = require('zrender/config');
    var zrEvent = require('zrender/tool/event');
    var zrArea = require('zrender/tool/area');
    var zrColor = require('zrender/tool/color');
    var zrUtil = require('zrender/tool/util');
    var zrShapeBase = require('zrender/shape/Base');

K
kener 已提交
25 26 27 28 29 30
    /**
     * 构造函数
     * @param {Object} messageCenter echart消息中心
     * @param {ZRender} zr zrender实例
     * @param {Object} option 提示框参数
     * @param {HtmlElement} dom 目标对象
K
kener 已提交
31
     * @param {ECharts} myChart 当前图表实例
K
kener 已提交
32
     */
K
kener 已提交
33 34 35 36 37 38 39 40 41
    function Tooltip(ecTheme, messageCenter, zr, option, dom, myChart) {
        Base.call(this, ecTheme, zr, option);
        
        this.messageCenter = messageCenter;
        this.dom = dom;
        this.myChart = myChart;
        
        var self = this;
        self._onmousemove = function (param) {
K
kener 已提交
42
            return self.__onmousemove(param);
K
kener 已提交
43 44
        };
        self._onglobalout = function (param) {
K
kener 已提交
45
            return self.__onglobalout(param);
K
kener 已提交
46 47 48 49
        };
        
        this.zr.on(zrConfig.EVENT.MOUSEMOVE, self._onmousemove);
        this.zr.on(zrConfig.EVENT.GLOBALOUT, self._onglobalout);
K
kener 已提交
50

K
kener 已提交
51
        self._hide = function (param) {
K
kener 已提交
52
            return self.__hide(param);
K
kener 已提交
53 54
        };
        self._tryShow = function(param) {
K
kener 已提交
55 56
            return self.__tryShow(param);
        };
K
kener 已提交
57
        self._refixed = function(param) {
K
kener 已提交
58 59
            return self.__refixed(param);
        };
K
kener 已提交
60
        
K
kener 已提交
61
        this.init(option);
K
kener 已提交
62 63 64 65 66 67 68 69 70
    }
    
    Tooltip.prototype = {
        type : ecConfig.COMPONENT_TYPE_TOOLTIP,
        // 通用样式
        _gCssText : 'position:absolute;'
                        + 'display:block;'
                        + 'border-style:solid;'
                        + 'white-space:nowrap;',
K
kener 已提交
71 72 73
        /**
         * 根据配置设置dom样式
         */
K
kener 已提交
74
        _style : function (opt) {
K
kener 已提交
75 76 77
            if (!opt) {
                return '';
            }
K
kener 已提交
78
            var cssText = [];
K
kener 已提交
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
            if (opt.transitionDuration) {
                var transitionText = 'left ' + opt.transitionDuration + 's,'
                                    + 'top ' + opt.transitionDuration + 's';
                cssText.push(
                    'transition:' + transitionText
                );
                cssText.push(
                    '-moz-transition:' + transitionText
                );
                cssText.push(
                    '-webkit-transition:' + transitionText
                );
                cssText.push(
                    '-o-transition:' + transitionText
                );
            }
K
kener 已提交
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111

            if (opt.backgroundColor) {
                // for sb ie~
                cssText.push(
                    'background-Color:' + zrColor.toHex(
                        opt.backgroundColor
                    )
                );
                cssText.push('filter:alpha(opacity=70)');
                cssText.push('background-Color:' + opt.backgroundColor);
            }

            if (typeof opt.borderWidth != 'undefined') {
                cssText.push('border-width:' + opt.borderWidth + 'px');
            }

            if (typeof opt.borderColor != 'undefined') {
K
kener 已提交
112
                cssText.push('border-color:' + opt.borderColor);
K
kener 已提交
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
            }

            if (typeof opt.borderRadius != 'undefined') {
                cssText.push(
                    'border-radius:' + opt.borderRadius + 'px'
                );
                cssText.push(
                    '-moz-border-radius:' + opt.borderRadius + 'px'
                );
                cssText.push(
                    '-webkit-border-radius:' + opt.borderRadius + 'px'
                );
                cssText.push(
                    '-o-border-radius:' + opt.borderRadius + 'px'
                );
            }

            var textStyle = opt.textStyle;
            if (textStyle) {
                textStyle.color && cssText.push('color:' + textStyle.color);
                textStyle.decoration && cssText.push(
                    'text-decoration:' + textStyle.decoration
                );
                textStyle.align && cssText.push(
                    'text-align:' + textStyle.align
                );
                textStyle.fontFamily && cssText.push(
                    'font-family:' + textStyle.fontFamily
                );
                textStyle.fontSize && cssText.push(
                    'font-size:' + textStyle.fontSize + 'px'
                );
                textStyle.fontSize && cssText.push(
                    'line-height:' + Math.round(textStyle.fontSize*3/2) + 'px'
                );
                textStyle.fontStyle && cssText.push(
                    'font-style:' + textStyle.fontStyle
                );
                textStyle.fontWeight && cssText.push(
                    'font-weight:' + textStyle.fontWeight
                );
            }


            var padding = opt.padding;
            if (typeof padding != 'undefined') {
K
kener 已提交
159
                padding = this.reformCssArray(padding);
K
kener 已提交
160 161 162 163 164 165 166 167 168 169 170
                cssText.push(
                    'padding:' + padding[0] + 'px '
                               + padding[1] + 'px '
                               + padding[2] + 'px '
                               + padding[3] + 'px'
                );
            }

            cssText = cssText.join(';') + ';';

            return cssText;
K
kener 已提交
171 172 173 174 175
        },
        
        __hide : function () {
            if (this._tDom) {
                this._tDom.style.display = 'none';
K
kener 已提交
176
            }
177
            var needRefresh = false;
K
kener 已提交
178 179 180
            if (!this._axisLineShape.invisible) {
                this._axisLineShape.invisible = true;
                this.zr.modShape(this._axisLineShape.id, this._axisLineShape);
181 182
                needRefresh = true;
            }
K
kener 已提交
183 184 185
            if (!this._axisShadowShape.invisible) {
                this._axisShadowShape.invisible = true;
                this.zr.modShape(this._axisShadowShape.id, this._axisShadowShape);
186
                needRefresh = true;
K
kener 已提交
187
            }
K
kener 已提交
188 189 190
            if (this._lastTipShape && this._lastTipShape.tipShape.length > 0) {
                this.zr.delShape(this._lastTipShape.tipShape);
                this._lastTipShape = false;
K
kener 已提交
191
            }
K
kener 已提交
192 193 194 195 196 197 198
            needRefresh && this.zr.refresh(); 
        },
        
        _show : function (x, y, specialCssText) {
            var domHeight = this._tDom.offsetHeight;
            var domWidth = this._tDom.offsetWidth;
            if (x + domWidth > this._zrWidth) {
K
kener 已提交
199
                // 太靠右
K
kener 已提交
200
                //x = this._zrWidth - domWidth;
K
kener 已提交
201
                x -= (domWidth + 40);
K
kener 已提交
202
            }
K
kener 已提交
203
            if (y + domHeight > this._zrHeight) {
K
kener 已提交
204
                // 太靠下
K
kener 已提交
205
                //y = this._zrHeight - domHeight;
K
kener 已提交
206
                y -= (domHeight - 20);
K
kener 已提交
207
            }
K
kener 已提交
208 209 210
            if (y < 20) {
                y = 0;
            }
K
kener 已提交
211 212
            this._tDom.style.cssText = this._gCssText
                                  + this._defaultCssText
K
kener 已提交
213 214
                                  + (specialCssText ? specialCssText : '')
                                  + 'left:' + x + 'px;top:' + y + 'px;';
K
kener 已提交
215 216
            
            if (domHeight < 10 || domWidth < 10) {
K
kener 已提交
217 218
                // this._zrWidth - x < 100 || this._zrHeight - y < 100
                setTimeout(this._refixed, 20);
K
kener 已提交
219
            }
K
kener 已提交
220
        },
K
kener 已提交
221
        
K
kener 已提交
222 223
        __refixed : function () {
            if (this._tDom) {
K
kener 已提交
224
                var cssText = '';
K
kener 已提交
225 226 227 228
                var domHeight = this._tDom.offsetHeight;
                var domWidth = this._tDom.offsetWidth;
                if (this._tDom.offsetLeft + domWidth > this._zrWidth) {
                    cssText += 'left:' + (this._zrWidth - domWidth - 20) + 'px;';
K
kener 已提交
229
                }
K
kener 已提交
230 231
                if (this._tDom.offsetTop + domHeight > this._zrHeight) {
                    cssText += 'top:' + (this._zrHeight - domHeight - 10) + 'px;';
K
kener 已提交
232 233
                }
                if (cssText !== '') {
K
kener 已提交
234
                    this._tDom.style.cssText += cssText;
K
kener 已提交
235 236
                }
            }
K
kener 已提交
237
        },
K
kener 已提交
238
        
K
kener 已提交
239
        __tryShow : function () {
K
kener 已提交
240 241
            var needShow;
            var trigger;
K
kener 已提交
242
            if (!this._curTarget) {
K
kener 已提交
243
                // 坐标轴事件
K
kener 已提交
244
                this._findPolarTrigger() || this._findAxisTrigger();
K
kener 已提交
245 246 247
            }
            else {
                // 数据项事件
K
kener 已提交
248 249
                if (this._curTarget._type == 'island' && option.tooltip.show) {
                    this._showItemTrigger();
K
kener 已提交
250 251
                    return;
                }
K
kener 已提交
252 253 254
                var serie = ecData.get(this._curTarget, 'series');
                var data = ecData.get(this._curTarget, 'data');
                needShow = this.deepQuery(
K
kener 已提交
255 256 257 258 259 260 261 262
                    [data, serie, option],
                    'tooltip.show'
                );
                if (typeof serie == 'undefined'
                    || typeof data == 'undefined'
                    || needShow === false
                ) {
                    // 不响应tooltip的数据对象延时隐藏
K
kener 已提交
263 264 265
                    clearTimeout(this._hidingTicket);
                    clearTimeout(this._showingTicket);
                    this._hidingTicket = setTimeout(this._hide, this._hideDelay);
K
kener 已提交
266 267
                }
                else {
K
kener 已提交
268
                    trigger = this.deepQuery(
K
kener 已提交
269 270 271 272
                        [data, serie, option],
                        'tooltip.trigger'
                    );
                    trigger == 'axis'
K
kener 已提交
273
                               ? this._showAxisTrigger(
K
kener 已提交
274
                                     serie.xAxisIndex, serie.yAxisIndex,
K
kener 已提交
275
                                     ecData.get(this._curTarget, 'dataIndex')
K
kener 已提交
276
                                 )
K
kener 已提交
277
                               : this._showItemTrigger();
K
kener 已提交
278 279
                }
            }
K
kener 已提交
280
        },
K
kener 已提交
281

K
kener 已提交
282 283 284
        /**
         * 直角系 
         */
K
kener 已提交
285 286 287
        _findAxisTrigger : function () {
            if (!this.xAxis || !this.yAxis) {
                this._hidingTicket = setTimeout(this._hide, this._hideDelay);
K
kener 已提交
288 289
                return;
            }
K
kener 已提交
290
            var series = this.option.series;
K
kener 已提交
291 292
            var xAxisIndex;
            var yAxisIndex;
K
kener 已提交
293 294
            for (var i = 0, l = series.length; i < l; i++) {
                // 找到第一个axis触发tooltip的系列
K
kener 已提交
295 296
                if (this.deepQuery(
                        [series[i], this.option], 'tooltip.trigger'
K
kener 已提交
297 298 299 300
                    ) == 'axis'
                ) {
                    xAxisIndex = series[i].xAxisIndex || 0;
                    yAxisIndex = series[i].yAxisIndex || 0;
K
kener 已提交
301 302
                    if (this.xAxis.getAxis(xAxisIndex)
                        && this.xAxis.getAxis(xAxisIndex).type
K
kener 已提交
303 304 305
                           == ecConfig.COMPONENT_TYPE_AXIS_CATEGORY
                    ) {
                        // 横轴为类目轴
K
kener 已提交
306 307
                        this._showAxisTrigger(xAxisIndex, yAxisIndex,
                            this._getNearestDataIndex('x', this.xAxis.getAxis(xAxisIndex))
K
kener 已提交
308 309
                        );
                        return;
K
kener 已提交
310
                    } 
K
kener 已提交
311 312
                    else if (this.yAxis.getAxis(yAxisIndex)
                             && this.yAxis.getAxis(yAxisIndex).type
K
kener 已提交
313
                                == ecConfig.COMPONENT_TYPE_AXIS_CATEGORY
K
kener 已提交
314 315
                    ) {
                        // 纵轴为类目轴
K
kener 已提交
316 317
                        this._showAxisTrigger(xAxisIndex, yAxisIndex,
                            this._getNearestDataIndex('y', this.yAxis.getAxis(yAxisIndex))
K
kener 已提交
318 319 320 321 322
                        );
                        return;
                    }
                }
            }
K
kener 已提交
323
        },
K
kener 已提交
324 325 326 327
        
        /**
         * 极坐标 
         */
K
kener 已提交
328 329
        _findPolarTrigger : function () {
            if (!this.polar) {
K
kener 已提交
330 331
                return false;
            }
K
kener 已提交
332 333 334
            var x = zrEvent.getX(this._event);
            var y = zrEvent.getY(this._event);
            var polarIndex = this.polar.getNearestIndex([x, y]);
K
kener 已提交
335 336 337 338 339 340 341 342 343 344
            var valueIndex;
            if (polarIndex) {
                valueIndex = polarIndex.valueIndex;
                polarIndex = polarIndex.polarIndex;
            }
            else {
                polarIndex = -1;
            }
            
            if (polarIndex != -1) {
K
kener 已提交
345
                return this._showPolarTrigger(polarIndex, valueIndex);
K
kener 已提交
346 347 348
            }
            
            return false;
K
kener 已提交
349
        },
K
kener 已提交
350
        
K
kener 已提交
351 352 353
        /**
         * 根据坐标轴事件带的属性获取最近的axisDataIndex
         */
K
kener 已提交
354
        _getNearestDataIndex : function (direction, categoryAxis) {
K
kener 已提交
355
            var dataIndex = -1;
K
kener 已提交
356 357
            var x = zrEvent.getX(this._event);
            var y = zrEvent.getY(this._event);
K
kener 已提交
358 359 360 361
            if (direction == 'x') {
                // 横轴为类目轴
                var left;
                var right;
K
kener 已提交
362
                var xEnd = this.grid.getXend();
K
kener 已提交
363 364 365 366 367 368 369 370 371 372 373 374
                var curCoord = categoryAxis.getCoordByIndex(dataIndex);
                while (curCoord < xEnd) {
                    if (curCoord <= x) {
                        left = curCoord;
                    }
                    if (curCoord >= x) {
                        break;
                    }
                    curCoord = categoryAxis.getCoordByIndex(++dataIndex);
                    right = curCoord;
                }
                if (x - left < right - x) {
K
kener 已提交
375
                    dataIndex -= dataIndex !== 0 ? 1 : 0;
K
kener 已提交
376 377 378 379 380 381
                }
                else {
                    // 离右边近,看是否为最后一个
                    if (typeof categoryAxis.getNameByIndex(dataIndex)
                        == 'undefined'
                    ) {
K
kener 已提交
382
                        dataIndex -= 1;
K
kener 已提交
383 384 385 386 387 388 389 390
                    }
                }
                return dataIndex;
            }
            else {
                // 纵轴为类目轴
                var top;
                var bottom;
K
kener 已提交
391
                var yStart = this.grid.getY();
K
kener 已提交
392 393 394 395 396 397 398 399 400 401 402 403 404
                var curCoord = categoryAxis.getCoordByIndex(dataIndex);
                while (curCoord > yStart) {
                    if (curCoord >= y) {
                        bottom = curCoord;
                    }
                    if (curCoord <= y) {
                        break;
                    }
                    curCoord = categoryAxis.getCoordByIndex(++dataIndex);
                    top = curCoord;
                }

                if (y - top > bottom - y) {
K
kener 已提交
405
                    dataIndex -= dataIndex !== 0 ? 1 : 0;
K
kener 已提交
406 407 408 409 410 411
                }
                else {
                    // 离上方边近,看是否为最后一个
                    if (typeof categoryAxis.getNameByIndex(dataIndex)
                        == 'undefined'
                    ) {
K
kener 已提交
412
                        dataIndex -= 1;
K
kener 已提交
413 414 415 416 417
                    }
                }
                return dataIndex;
            }
            return -1;
K
kener 已提交
418
        },
K
kener 已提交
419

K
kener 已提交
420 421 422
        /**
         * 直角系 
         */
K
kener 已提交
423 424
        _showAxisTrigger : function (xAxisIndex, yAxisIndex, dataIndex) {
            !this._event.connectTrigger && this.messageCenter.dispatch(
K
kener 已提交
425
                ecConfig.EVENT.TOOLTIP_IN_GRID,
K
kener 已提交
426
                this._event
K
kener 已提交
427
            );
K
kener 已提交
428 429
            if (typeof this.xAxis == 'undefined'
                || typeof this.yAxis == 'undefined'
K
kener 已提交
430 431 432 433 434
                || typeof xAxisIndex == 'undefined'
                || typeof yAxisIndex == 'undefined'
                || dataIndex < 0
            ) {
                // 不响应tooltip的数据对象延时隐藏
K
kener 已提交
435 436 437
                clearTimeout(this._hidingTicket);
                clearTimeout(this._showingTicket);
                this._hidingTicket = setTimeout(this._hide, this._hideDelay);
K
kener 已提交
438 439
                return;
            }
K
kener 已提交
440
            var series = this.option.series;
K
kener 已提交
441
            var seriesArray = [];
K
kener 已提交
442
            var seriesIndex = [];
K
kener 已提交
443 444 445 446 447
            var categoryAxis;
            var x;
            var y;

            var formatter;
K
kener 已提交
448
            var showContent;
K
kener 已提交
449
            var specialCssText = '';
K
kener 已提交
450 451
            if (this.option.tooltip.trigger == 'axis') {
                if (this.option.tooltip.show === false) {
K
kener 已提交
452 453
                    return;
                }
K
kener 已提交
454
                formatter = this.option.tooltip.formatter;
K
kener 已提交
455 456 457
            }

            if (xAxisIndex != -1
K
kener 已提交
458
                && this.xAxis.getAxis(xAxisIndex).type
K
kener 已提交
459 460 461
                   == ecConfig.COMPONENT_TYPE_AXIS_CATEGORY
            ) {
                // 横轴为类目轴,找到所有用这条横轴并且axis触发的系列数据
K
kener 已提交
462
                categoryAxis = this.xAxis.getAxis(xAxisIndex);
K
kener 已提交
463
                for (var i = 0, l = series.length; i < l; i++) {
K
kener 已提交
464
                    if (!this._isSelected(series[i].name)) {
K
kener 已提交
465 466
                        continue;
                    }
K
kener 已提交
467
                    if (series[i].xAxisIndex == xAxisIndex
K
kener 已提交
468 469
                        && this.deepQuery(
                               [series[i], this.option], 'tooltip.trigger'
K
kener 已提交
470 471
                           ) == 'axis'
                    ) {
K
kener 已提交
472
                        showContent = this.query(
473
                            series[i],
K
kener 已提交
474 475
                            'tooltip.showContent'
                        ) || showContent;
K
kener 已提交
476
                        formatter = this.query(
477
                            series[i],
K
kener 已提交
478 479
                            'tooltip.formatter'
                        ) || formatter;
K
kener 已提交
480
                        specialCssText += this._style(this.query(
481
                                              series[i], 'tooltip'
K
kener 已提交
482 483
                                          ));
                        seriesArray.push(series[i]);
K
kener 已提交
484
                        seriesIndex.push(i);
K
kener 已提交
485 486
                    }
                }
K
kener 已提交
487
                // 寻找高亮元素
K
kener 已提交
488
                this.messageCenter.dispatch(
K
kener 已提交
489
                    ecConfig.EVENT.TOOLTIP_HOVER,
K
kener 已提交
490
                    this._event,
K
kener 已提交
491 492
                    {
                        seriesIndex : seriesIndex,
K
kener 已提交
493 494
                        dataIndex : this.component.dataZoom
                                    ? this.component.dataZoom.getRealDataIndex(
495 496 497 498
                                        seriesIndex,
                                        dataIndex
                                      )
                                    : dataIndex
K
kener 已提交
499 500
                    }
                );
K
kener 已提交
501 502
                y = zrEvent.getY(this._event) + 10;
                x = this.subPixelOptimize(
K
kener 已提交
503
                    categoryAxis.getCoordByIndex(dataIndex),
K
kener 已提交
504
                    this._axisLineWidth
K
kener 已提交
505
                );
K
kener 已提交
506
                this._styleAxisPointer(
507
                    seriesArray,
K
kener 已提交
508 509
                    x, this.grid.getY(), 
                    x, this.grid.getYend(),
510 511
                    categoryAxis.getGap()
                );
K
kener 已提交
512 513 514
                x += 10;
            }
            else if (yAxisIndex != -1
K
kener 已提交
515
                     && this.yAxis.getAxis(yAxisIndex).type
516
                        == ecConfig.COMPONENT_TYPE_AXIS_CATEGORY
K
kener 已提交
517 518
            ) {
                // 纵轴为类目轴,找到所有用这条纵轴并且axis触发的系列数据
K
kener 已提交
519
                categoryAxis = this.yAxis.getAxis(yAxisIndex);
K
kener 已提交
520
                for (var i = 0, l = series.length; i < l; i++) {
K
kener 已提交
521
                    if (!this._isSelected(series[i].name)) {
K
kener 已提交
522 523
                        continue;
                    }
K
kener 已提交
524
                    if (series[i].yAxisIndex == yAxisIndex
K
kener 已提交
525 526
                        && this.deepQuery(
                               [series[i], this.option], 'tooltip.trigger'
K
kener 已提交
527 528
                           ) == 'axis'
                    ) {
K
kener 已提交
529
                        showContent = this.query(
530
                            series[i],
K
kener 已提交
531 532
                            'tooltip.showContent'
                        ) || showContent;
K
kener 已提交
533
                        formatter = this.query(
534
                            series[i],
K
kener 已提交
535 536
                            'tooltip.formatter'
                        ) || formatter;
K
kener 已提交
537
                        specialCssText += this._style(this.query(
538
                                              series[i], 'tooltip'
K
kener 已提交
539 540
                                          ));
                        seriesArray.push(series[i]);
K
kener 已提交
541
                        seriesIndex.push(i);
K
kener 已提交
542 543
                    }
                }
K
kener 已提交
544
                // 寻找高亮元素
K
kener 已提交
545
                this.messageCenter.dispatch(
K
kener 已提交
546
                    ecConfig.EVENT.TOOLTIP_HOVER,
K
kener 已提交
547
                    this._event,
K
kener 已提交
548 549
                    {
                        seriesIndex : seriesIndex,
K
kener 已提交
550 551
                        dataIndex : this.component.dataZoom
                                    ? this.component.dataZoom.getRealDataIndex(
552 553 554 555
                                        seriesIndex,
                                        dataIndex
                                      )
                                    : dataIndex
K
kener 已提交
556 557
                    }
                );
K
kener 已提交
558 559
                x = zrEvent.getX(this._event) + 10;
                y = this.subPixelOptimize(
K
kener 已提交
560
                    categoryAxis.getCoordByIndex(dataIndex),
K
kener 已提交
561
                    this._axisLineWidth
K
kener 已提交
562
                );
K
kener 已提交
563
                this._styleAxisPointer(
564
                    seriesArray,
K
kener 已提交
565 566
                    this.grid.getX(), y, 
                    this.grid.getXend(), y,
567 568
                    categoryAxis.getGap()
                );
K
kener 已提交
569 570 571 572 573 574 575 576
                y += 10;
            }

            if (seriesArray.length > 0) {
                var data;
                if (typeof formatter == 'function') {
                    var params = [];
                    for (var i = 0, l = seriesArray.length; i < l; i++) {
K
kener 已提交
577 578 579 580 581 582 583
                        data = seriesArray[i].data[dataIndex];
                        data = typeof data != 'undefined'
                               ? (typeof data.value != 'undefined'
                                   ? data.value
                                   : data)
                               : '-';
                               
K
kener 已提交
584
                        params.push([
K
kener 已提交
585
                            seriesArray[i].name || '',
K
kener 已提交
586 587 588 589
                            categoryAxis.getNameByIndex(dataIndex),
                            data
                        ]);
                    }
K
kener 已提交
590 591 592
                    this._curTicket = 'axis:' + dataIndex;
                    this._tDom.innerHTML = formatter(
                        params, this._curTicket, this._setContent
K
kener 已提交
593 594 595
                    );
                }
                else if (typeof formatter == 'string') {
K
kener 已提交
596
                    this._curTicket = NaN;
K
kener 已提交
597 598 599 600 601 602
                    formatter = formatter.replace('{a}','{a0}')
                                         .replace('{b}','{b0}')
                                         .replace('{c}','{c0}');
                    for (var i = 0, l = seriesArray.length; i < l; i++) {
                        formatter = formatter.replace(
                            '{a' + i + '}',
K
kener 已提交
603
                            this._encodeHTML(seriesArray[i].name || '')
K
kener 已提交
604 605 606
                        );
                        formatter = formatter.replace(
                            '{b' + i + '}',
K
kener 已提交
607
                            this._encodeHTML(categoryAxis.getNameByIndex(dataIndex))
K
kener 已提交
608
                        );
K
kener 已提交
609 610 611 612 613 614
                        data = seriesArray[i].data[dataIndex];
                        data = typeof data != 'undefined'
                               ? (typeof data.value != 'undefined'
                                   ? data.value
                                   : data)
                               : '-';
K
kener 已提交
615 616
                        formatter = formatter.replace(
                            '{c' + i + '}',
617
                            data instanceof Array 
K
kener 已提交
618
                            ? data : this.numAddCommas(data)
K
kener 已提交
619 620
                        );
                    }
K
kener 已提交
621
                    this._tDom.innerHTML = formatter;
K
kener 已提交
622 623
                }
                else {
K
kener 已提交
624 625
                    this._curTicket = NaN;
                    formatter = this._encodeHTML(
K
kener 已提交
626 627 628
                        categoryAxis.getNameByIndex(dataIndex)
                    );

K
kener 已提交
629
                    for (var i = 0, l = seriesArray.length; i < l; i++) {
K
kener 已提交
630
                        formatter += '<br/>' 
K
kener 已提交
631
                                     + this._encodeHTML(seriesArray[i].name || '')
K
kener 已提交
632
                                     + ' : ';
K
kener 已提交
633
                        data = seriesArray[i].data[dataIndex];
K
kener 已提交
634
                        data = typeof data != 'undefined'
K
kener 已提交
635 636 637 638
                               ? (typeof data.value != 'undefined'
                                   ? data.value
                                   : data)
                               : '-';
639
                        formatter += data instanceof Array 
K
kener 已提交
640
                                     ? data : this.numAddCommas(data);
K
kener 已提交
641
                    }
K
kener 已提交
642
                    this._tDom.innerHTML = formatter;
K
kener 已提交
643 644
                }

K
kener 已提交
645
                if (showContent === false || !this.option.tooltip.showContent) {
K
kener 已提交
646 647 648 649
                    // 只用tooltip的行为,不显示主体
                    return;
                }
                
K
kener 已提交
650 651 652 653 654
                if (!this.hasAppend) {
                    this._tDom.style.left = this._zrWidth / 2 + 'px';
                    this._tDom.style.top = this._zrHeight / 2 + 'px';
                    this.dom.firstChild.appendChild(this._tDom);
                    this.hasAppend = true;
K
kener 已提交
655
                }
K
kener 已提交
656
                this._show(x, y, specialCssText);
K
kener 已提交
657
            }
K
kener 已提交
658
        },
659
        
K
kener 已提交
660 661 662
        /**
         * 极坐标 
         */
K
kener 已提交
663 664
        _showPolarTrigger : function (polarIndex, dataIndex) {
            if (typeof this.polar == 'undefined'
K
kener 已提交
665 666 667 668 669 670
                || typeof polarIndex == 'undefined'
                || typeof dataIndex == 'undefined'
                || dataIndex < 0
            ) {
                return false;
            }
K
kener 已提交
671
            var series = this.option.series;
K
kener 已提交
672 673 674
            var seriesArray = [];

            var formatter;
K
kener 已提交
675
            var showContent;
K
kener 已提交
676
            var specialCssText = '';
K
kener 已提交
677 678
            if (this.option.tooltip.trigger == 'axis') {
                if (this.option.tooltip.show === false) {
K
kener 已提交
679 680
                    return false;
                }
K
kener 已提交
681
                formatter = this.option.tooltip.formatter;
K
kener 已提交
682
            }
K
kener 已提交
683
            var indicatorName = 
K
kener 已提交
684
                    this.option.polar[polarIndex].indicator[dataIndex].text;
K
kener 已提交
685 686 687

            // 找到所有用这个极坐标并且axis触发的系列数据
            for (var i = 0, l = series.length; i < l; i++) {
K
kener 已提交
688
                if (!this._isSelected(series[i].name)) {
K
kener 已提交
689 690
                    continue;
                }
K
kener 已提交
691
                if (series[i].polarIndex == polarIndex
K
kener 已提交
692 693
                    && this.deepQuery(
                           [series[i], this.option], 'tooltip.trigger'
K
kener 已提交
694 695
                       ) == 'axis'
                ) {
K
kener 已提交
696
                    showContent = this.query(
697
                        series[i],
K
kener 已提交
698 699
                        'tooltip.showContent'
                    ) || showContent;
K
kener 已提交
700
                    formatter = this.query(
701
                        series[i],
K
kener 已提交
702 703
                        'tooltip.formatter'
                    ) || formatter;
K
kener 已提交
704
                    specialCssText += this._style(this.query(
705
                                          series[i], 'tooltip'
K
kener 已提交
706 707 708 709 710 711 712 713 714 715 716 717 718
                                      ));
                    seriesArray.push(series[i]);
                }
            }
            if (seriesArray.length > 0) {
                var polarData;
                var data;
                var params = [];

                for (var i = 0, l = seriesArray.length; i < l; i++) {
                    polarData = seriesArray[i].data;
                    for (var j = 0, k = polarData.length; j < k; j++) {
                        data = polarData[j];
K
kener 已提交
719
                        if (!this._isSelected(data.name)) {
K
kener 已提交
720 721
                            continue;
                        }
K
kener 已提交
722 723 724 725 726
                        data = typeof data != 'undefined'
                               ? data
                               : {name:'', value: {dataIndex:'-'}};
                               
                        params.push([
K
kener 已提交
727
                            seriesArray[i].name || '',
K
kener 已提交
728 729 730 731 732 733
                            data.name,
                            data.value[dataIndex],
                            indicatorName
                        ]);
                    }
                }
K
kener 已提交
734 735 736
                if (params.length <= 0) {
                    return;
                }
K
kener 已提交
737
                if (typeof formatter == 'function') {
K
kener 已提交
738 739 740
                    this._curTicket = 'axis:' + dataIndex;
                    this._tDom.innerHTML = formatter(
                        params, this._curTicket, this._setContent
K
kener 已提交
741 742 743 744 745 746 747 748 749 750
                    );
                }
                else if (typeof formatter == 'string') {
                    formatter = formatter.replace('{a}','{a0}')
                                         .replace('{b}','{b0}')
                                         .replace('{c}','{c0}')
                                         .replace('{d}','{d0}');
                    for (var i = 0, l = params.length; i < l; i++) {
                        formatter = formatter.replace(
                            '{a' + i + '}',
K
kener 已提交
751
                            this._encodeHTML(params[i][0])
K
kener 已提交
752 753 754
                        );
                        formatter = formatter.replace(
                            '{b' + i + '}',
K
kener 已提交
755
                            this._encodeHTML(params[i][1])
K
kener 已提交
756 757 758
                        );
                        formatter = formatter.replace(
                            '{c' + i + '}',
K
kener 已提交
759
                            this.numAddCommas(params[i][2])
K
kener 已提交
760 761 762
                        );
                        formatter = formatter.replace(
                            '{d' + i + '}',
K
kener 已提交
763
                            this._encodeHTML(params[i][3])
K
kener 已提交
764 765
                        );
                    }
K
kener 已提交
766
                    this._tDom.innerHTML = formatter;
K
kener 已提交
767 768
                }
                else {
K
kener 已提交
769 770 771
                    formatter = this._encodeHTML(params[0][1]) + '<br/>' 
                                + this._encodeHTML(params[0][3]) + ' : ' 
                                + this.numAddCommas(params[0][2]);
K
kener 已提交
772
                    for (var i = 1, l = params.length; i < l; i++) {
K
kener 已提交
773
                        formatter += '<br/>' + this._encodeHTML(params[i][1]) 
K
kener 已提交
774
                                     + '<br/>';
K
kener 已提交
775 776
                        formatter += this._encodeHTML(params[i][3]) + ' : ' 
                                     + this.numAddCommas(params[i][2]);
K
kener 已提交
777
                    }
K
kener 已提交
778
                    this._tDom.innerHTML = formatter;
K
kener 已提交
779 780
                }

K
kener 已提交
781
                if (showContent === false || !this.option.tooltip.showContent) {
K
kener 已提交
782 783 784 785
                    // 只用tooltip的行为,不显示主体
                    return;
                }
                
K
kener 已提交
786 787 788 789 790
                if (!this.hasAppend) {
                    this._tDom.style.left = this._zrWidth / 2 + 'px';
                    this._tDom.style.top = this._zrHeight / 2 + 'px';
                    this.dom.firstChild.appendChild(this._tDom);
                    this.hasAppend = true;
K
kener 已提交
791
                }
K
kener 已提交
792 793 794
                this._show(
                    zrEvent.getX(this._event), 
                    zrEvent.getY(this._event), 
K
kener 已提交
795 796 797 798
                    specialCssText
                );
                return true;
            }
K
kener 已提交
799
        },
K
kener 已提交
800
        
K
kener 已提交
801 802 803 804 805 806 807
        _showItemTrigger : function () {
            var serie = ecData.get(this._curTarget, 'series');
            var data = ecData.get(this._curTarget, 'data');
            var name = ecData.get(this._curTarget, 'name');
            var value = ecData.get(this._curTarget, 'value');
            var special = ecData.get(this._curTarget, 'special');
            var special2 = ecData.get(this._curTarget, 'special2');
K
kener 已提交
808 809
            // 从低优先级往上找到trigger为item的formatter和样式
            var formatter;
K
kener 已提交
810
            var showContent;
K
kener 已提交
811
            var specialCssText = '';
K
kener 已提交
812 813
            var indicator;
            var html = '';
K
kener 已提交
814
            if (this._curTarget._type != 'island') {
K
kener 已提交
815
                // 全局
K
kener 已提交
816 817
                if (this.option.tooltip.trigger == 'item') {
                    formatter = this.option.tooltip.formatter;
K
kener 已提交
818 819
                }
                // 系列
K
kener 已提交
820 821
                if (this.query(serie, 'tooltip.trigger') == 'item') {
                    showContent = this.query(
822
                                      serie, 'tooltip.showContent'
K
kener 已提交
823
                                  ) || showContent;
K
kener 已提交
824
                    formatter = this.query(
825
                                    serie, 'tooltip.formatter'
K
kener 已提交
826
                                ) || formatter;
K
kener 已提交
827
                    specialCssText += this._style(this.query(
828
                                          serie, 'tooltip'
K
kener 已提交
829 830 831
                                      ));
                }
                // 数据项
K
kener 已提交
832
                showContent = this.query(
833
                                  data, 'tooltip.showContent'
K
kener 已提交
834
                              ) || showContent;
K
kener 已提交
835
                formatter = this.query(
836
                                data, 'tooltip.formatter'
K
kener 已提交
837
                            ) || formatter;
K
kener 已提交
838
                specialCssText += this._style(this.query(data, 'tooltip'));
K
格式  
kener 已提交
839 840
            }
            else {
K
kener 已提交
841 842
                showContent = this.deepQuery(
                    [data, serie, this.option],
K
kener 已提交
843 844
                    'tooltip.showContent'
                );
K
kener 已提交
845 846
                formatter = this.deepQuery(
                    [data, serie, this.option],
K
kener 已提交
847 848 849 850 851
                    'tooltip.islandFormatter'
                );
            }

            if (typeof formatter == 'function') {
K
kener 已提交
852
                this._curTicket = (serie.name || '')
K
kener 已提交
853
                             + ':'
K
kener 已提交
854 855
                             + ecData.get(this._curTarget, 'dataIndex');
                this._tDom.innerHTML = formatter(
K
kener 已提交
856
                    [
K
kener 已提交
857
                        serie.name || '',
K
kener 已提交
858 859
                        name,
                        value,
L
lang 已提交
860 861
                        special,
                        special2
K
kener 已提交
862
                    ],
K
kener 已提交
863 864
                    this._curTicket,
                    this._setContent
K
kener 已提交
865 866 867
                );
            }
            else if (typeof formatter == 'string') {
K
kener 已提交
868
                this._curTicket = NaN;
K
kener 已提交
869 870
                formatter = formatter.replace('{a}','{a0}')
                                     .replace('{b}','{b0}')
K
kener 已提交
871 872
                                     .replace('{c}','{c0}');
                formatter = formatter.replace(
K
kener 已提交
873
                                          '{a0}', this._encodeHTML(serie.name || '')
K
kener 已提交
874
                                      )
K
kener 已提交
875
                                     .replace('{b0}', this._encodeHTML(name))
876 877 878
                                     .replace(
                                         '{c0}', 
                                         value instanceof Array
K
kener 已提交
879
                                         ? value : this.numAddCommas(value)
880
                                     );
K
kener 已提交
881

K
kener 已提交
882 883 884
                formatter = formatter.replace('{d}','{d0}')
                                     .replace('{d0}', special || '');
                formatter = formatter.replace('{e}','{e0}')
K
kener 已提交
885
                    .replace('{e0}', ecData.get(this._curTarget, 'special2') || '');
K
kener 已提交
886

K
kener 已提交
887
                this._tDom.innerHTML = formatter;
K
kener 已提交
888 889
            }
            else {
K
kener 已提交
890
                this._curTicket = NaN;
K
kener 已提交
891
                if (serie.type == ecConfig.CHART_TYPE_SCATTER) {
K
kener 已提交
892 893
                    this._tDom.innerHTML = (typeof serie.name != 'undefined'
                                          ? (this._encodeHTML(serie.name) + '<br/>')
K
kener 已提交
894 895 896
                                          : ''
                                      ) 
                                      + (name === '' 
K
kener 已提交
897
                                            ? '' : (this._encodeHTML(name) + ' : ')
K
kener 已提交
898 899
                                      ) 
                                      + value 
K
kener 已提交
900
                                      + (typeof special == 'undefined'
K
kener 已提交
901
                                          ? ''
K
kener 已提交
902
                                          : (' (' + special + ')'));
K
kener 已提交
903
                }
K
kener 已提交
904
                else if (serie.type == ecConfig.CHART_TYPE_RADAR && special) {
K
kener 已提交
905
                    indicator = special;
K
kener 已提交
906
                    html += this._encodeHTML(
K
kener 已提交
907 908 909
                        name === '' ? (serie.name || '') : name
                    );
                    html += html === '' ? '' : '<br />';
K
kener 已提交
910
                    for (var i = 0 ; i < indicator.length; i ++) {
K
kener 已提交
911 912
                        html += this._encodeHTML(indicator[i].text) + ' : ' 
                                + this.numAddCommas(value[i]) + '<br />';
K
kener 已提交
913
                    }
K
kener 已提交
914
                    this._tDom.innerHTML = html;
K
kener 已提交
915
                }
K
kener 已提交
916 917 918
                else if (serie.type == ecConfig.CHART_TYPE_CHORD) {
                    if (typeof special2 == 'undefined') {
                        // 外环上
K
kener 已提交
919 920
                        this._tDom.innerHTML = this._encodeHTML(name) + ' (' 
                                          + this.numAddCommas(value) + ')';
K
kener 已提交
921 922
                    }
                    else {
K
kener 已提交
923 924
                        var name1 = this._encodeHTML(name);
                        var name2 = this._encodeHTML(special);
K
kener 已提交
925
                        // 内部弦上
K
kener 已提交
926 927
                        this._tDom.innerHTML = (typeof serie.name != 'undefined'
                                          ? (this._encodeHTML(serie.name) + '<br/>')
K
kener 已提交
928
                                          : '')
929
                              + name1 + ' -> ' + name2 
K
kener 已提交
930
                              + ' (' + this.numAddCommas(value) + ')'
L
lang 已提交
931
                              + '<br />'
932
                              + name2 + ' -> ' + name1
K
kener 已提交
933
                              + ' (' + this.numAddCommas(special2) + ')';
K
kener 已提交
934 935
                    }
                }
K
kener 已提交
936
                else {
K
kener 已提交
937 938
                    this._tDom.innerHTML = (typeof serie.name != 'undefined'
                                      ? (this._encodeHTML(serie.name) + '<br/>')
K
kener 已提交
939
                                      : '')
K
kener 已提交
940 941
                                      + this._encodeHTML(name) + ' : ' 
                                      + this.numAddCommas(value) +
K
kener 已提交
942
                                      (typeof special == 'undefined'
K
kener 已提交
943
                                      ? ''
K
kener 已提交
944
                                      : (' ('+ this.numAddCommas(special) +')')
945
                                      );
K
kener 已提交
946
                }
K
kener 已提交
947 948
            }

K
kener 已提交
949 950 951 952
            if (!this._axisLineShape.invisible) {
                this._axisLineShape.invisible = true;
                this.zr.modShape(this._axisLineShape.id, this._axisLineShape);
                this.zr.refresh();
K
kener 已提交
953 954
            }
            
K
kener 已提交
955
            if (showContent === false || !this.option.tooltip.showContent) {
K
kener 已提交
956 957 958 959
                // 只用tooltip的行为,不显示主体
                return;
            }
            
K
kener 已提交
960 961 962 963 964
            if (!this.hasAppend) {
                this._tDom.style.left = this._zrWidth / 2 + 'px';
                this._tDom.style.top = this._zrHeight / 2 + 'px';
                this.dom.firstChild.appendChild(this._tDom);
                this.hasAppend = true;
K
kener 已提交
965 966
            }

K
kener 已提交
967 968 969
            this._show(
                zrEvent.getX(this._event) + 20,
                zrEvent.getY(this._event) - 20,
K
kener 已提交
970 971
                specialCssText
            );
K
kener 已提交
972
        },
K
kener 已提交
973

974 975 976
        /**
         * 设置坐标轴指示器样式 
         */
K
kener 已提交
977
        _styleAxisPointer : function (seriesArray, xStart, yStart, xEnd, yEnd, gap) {
978 979 980
            if (seriesArray.length > 0) {
                var queryTarget;
                var curType;
K
kener 已提交
981
                var axisPointer = this.option.tooltip.axisPointer;
982 983 984 985 986 987 988 989
                var pointType = axisPointer.type;
                var lineColor = axisPointer.lineStyle.color;
                var lineWidth = axisPointer.lineStyle.width;
                var lineType = axisPointer.lineStyle.type;
                var areaSize = axisPointer.areaStyle.size;
                var areaColor = axisPointer.areaStyle.color;
                
                for (var i = 0, l = seriesArray.length; i < l; i++) {
K
kener 已提交
990 991
                    if (this.deepQuery(
                           [seriesArray[i], this.option], 'tooltip.trigger'
992 993
                       ) == 'axis'
                    ) {
994
                        queryTarget = seriesArray[i];
K
kener 已提交
995
                        curType = this.query(
996 997 998 999 1000
                            queryTarget,
                            'tooltip.axisPointer.type'
                        );
                        pointType = curType || pointType; 
                        if (curType == 'line') {
K
kener 已提交
1001
                            lineColor = this.query(
1002 1003 1004
                                queryTarget,
                                'tooltip.axisPointer.lineStyle.color'
                            ) || lineColor;
K
kener 已提交
1005
                            lineWidth = this.query(
1006 1007 1008
                                queryTarget,
                                'tooltip.axisPointer.lineStyle.width'
                            ) || lineWidth;
K
kener 已提交
1009
                            lineType = this.query(
1010 1011 1012 1013 1014
                                queryTarget,
                                'tooltip.axisPointer.lineStyle.type'
                            ) || lineType;
                        }
                        else if (curType == 'shadow') {
K
kener 已提交
1015
                            areaSize = this.query(
1016 1017 1018
                                queryTarget,
                                'tooltip.axisPointer.areaStyle.size'
                            ) || areaSize;
K
kener 已提交
1019
                            areaColor = this.query(
1020 1021 1022 1023 1024 1025 1026 1027
                                queryTarget,
                                'tooltip.axisPointer.areaStyle.color'
                            ) || areaColor;
                        }
                    }
                }
                
                if (pointType == 'line') {
K
kener 已提交
1028
                    this._axisLineShape.style = {
1029 1030 1031 1032 1033 1034 1035 1036
                        xStart : xStart,
                        yStart : yStart,
                        xEnd : xEnd,
                        yEnd : yEnd,
                        strokeColor : lineColor,
                        lineWidth : lineWidth,
                        lineType : lineType
                    };
K
kener 已提交
1037 1038
                    this._axisLineShape.invisible = false;
                    this.zr.modShape(this._axisLineShape.id, this._axisLineShape);
1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051
                }
                else if (pointType == 'shadow') {
                    if (typeof areaSize == 'undefined' 
                        || areaSize == 'auto'
                        || isNaN(areaSize)
                    ) {
                        lineWidth = gap;
                    }
                    else {
                        lineWidth = areaSize;
                    }
                    if (xStart == xEnd) {
                        // 纵向
K
kener 已提交
1052
                        if (Math.abs(this.grid.getX() - xStart) < 2) {
1053 1054 1055 1056
                            // 最左边
                            lineWidth /= 2;
                            xStart = xEnd = xEnd + lineWidth / 2;
                        }
K
kener 已提交
1057
                        else if (Math.abs(this.grid.getXend() - xStart) < 2) {
1058 1059 1060 1061 1062 1063 1064
                            // 最右边
                            lineWidth /= 2;
                            xStart = xEnd = xEnd - lineWidth / 2;
                        }
                    }
                    else if (yStart == yEnd) {
                        // 横向
K
kener 已提交
1065
                        if (Math.abs(this.grid.getY() - yStart) < 2) {
1066 1067 1068 1069
                            // 最上边
                            lineWidth /= 2;
                            yStart = yEnd = yEnd + lineWidth / 2;
                        }
K
kener 已提交
1070
                        else if (Math.abs(this.grid.getYend() - yStart) < 2) {
1071 1072 1073 1074 1075
                            // 最右边
                            lineWidth /= 2;
                            yStart = yEnd = yEnd - lineWidth / 2;
                        }
                    }
K
kener 已提交
1076
                    this._axisShadowShape.style = {
1077 1078 1079 1080 1081 1082 1083
                        xStart : xStart,
                        yStart : yStart,
                        xEnd : xEnd,
                        yEnd : yEnd,
                        strokeColor : areaColor,
                        lineWidth : lineWidth
                    };
K
kener 已提交
1084 1085
                    this._axisShadowShape.invisible = false;
                    this.zr.modShape(this._axisShadowShape.id, this._axisShadowShape);
1086
                }
K
kener 已提交
1087
                this.zr.refresh();
1088
            }
K
kener 已提交
1089
        },
1090

K
kener 已提交
1091 1092 1093
        __onmousemove : function (param) {
            clearTimeout(this._hidingTicket);
            clearTimeout(this._showingTicket);
K
kener 已提交
1094
            var target = param.target;
K
kener 已提交
1095 1096 1097
            var mx = zrEvent.getX(param.event);
            var my = zrEvent.getY(param.event);
            if (!target) {
K
kener 已提交
1098
                // 判断是否落到直角系里,axis触发的tooltip
K
kener 已提交
1099 1100 1101 1102 1103 1104 1105
                this._curTarget = false;
                this._event = param.event;
                this._event._target = this._event.target || this._event.toElement;
                this._event.zrenderX = mx;
                this._event.zrenderY = my;
                if (this._needAxisTrigger 
                    && this.grid 
K
kener 已提交
1106
                    && zrArea.isInside(
K
kener 已提交
1107
                        rectangleInstance,
K
kener 已提交
1108
                        this.grid.getArea(),
K
kener 已提交
1109 1110 1111 1112
                        mx,
                        my
                    )
                ) {
K
kener 已提交
1113
                    this._showingTicket = setTimeout(this._tryShow, this._showDelay);
K
kener 已提交
1114
                }
K
kener 已提交
1115 1116 1117
                else if (this._needAxisTrigger 
                        && this.polar 
                        && this.polar.isInside([mx, my]) != -1
K
kener 已提交
1118
                ) {
K
kener 已提交
1119
                    this._showingTicket = setTimeout(this._tryShow, this._showDelay);
K
kener 已提交
1120 1121
                }
                else {
K
kener 已提交
1122
                    !this._event.connectTrigger && this.messageCenter.dispatch(
K
kener 已提交
1123
                        ecConfig.EVENT.TOOLTIP_OUT_GRID,
K
kener 已提交
1124
                        this._event
K
kener 已提交
1125
                    );
K
kener 已提交
1126
                    this._hidingTicket = setTimeout(this._hide, this._hideDelay);
K
kener 已提交
1127 1128 1129
                }
            }
            else {
K
kener 已提交
1130 1131 1132 1133 1134
                this._curTarget = target;
                this._event = param.event;
                this._event._target = this._event.target || this._event.toElement;
                this._event.zrenderX = mx;
                this._event.zrenderY = my;
K
kener 已提交
1135
                var polarIndex;
K
kener 已提交
1136 1137 1138
                if (this._needAxisTrigger 
                    && this.polar 
                    && (polarIndex = this.polar.isInside([mx, my])) != -1
K
kener 已提交
1139 1140
                ) {
                    // 看用这个polar的系列数据是否是axis触发,如果是设置_curTarget为nul
K
kener 已提交
1141
                    var series = this.option.series;
K
kener 已提交
1142 1143
                    for (var i = 0, l = series.length; i < l; i++) {
                        if (series[i].polarIndex == polarIndex
K
kener 已提交
1144 1145
                            && this.deepQuery(
                                   [series[i], this.option], 'tooltip.trigger'
K
kener 已提交
1146 1147
                               ) == 'axis'
                        ) {
K
kener 已提交
1148
                            this._curTarget = null;
K
kener 已提交
1149 1150 1151 1152 1153
                            break;
                        }
                    }
                   
                }
K
kener 已提交
1154
                this._showingTicket = setTimeout(this._tryShow, this._showDelay);
K
kener 已提交
1155
            }
K
kener 已提交
1156
        },
K
kener 已提交
1157

1158 1159 1160
        /**
         * zrender事件响应:鼠标离开绘图区域
         */
K
kener 已提交
1161 1162 1163 1164 1165 1166
        __onglobalout : function () {
            clearTimeout(this._hidingTicket);
            clearTimeout(this._showingTicket);
            this._hidingTicket = setTimeout(this._hide, this._hideDelay);
        },
        
K
kener 已提交
1167 1168 1169
        /**
         * 异步回调填充内容
         */
K
kener 已提交
1170 1171
        _setContent : function (ticket, content) {
            if (!this._tDom) {
K
kener 已提交
1172 1173
                return;
            }
K
kener 已提交
1174 1175
            if (ticket == this._curTicket) {
                this._tDom.innerHTML = content;
K
kener 已提交
1176
            }
K
kener 已提交
1177
            
K
kener 已提交
1178 1179
            setTimeout(this._refixed, 20);
        },
K
kener 已提交
1180

K
kener 已提交
1181 1182 1183 1184 1185 1186 1187
        setComponent : function () {
            this.component = this.myChart.component;
            this.grid = this.component.grid;
            this.xAxis = this.component.xAxis;
            this.yAxis = this.component.yAxis;
            this.polar = this.component.polar;
        },
K
kener 已提交
1188
        
K
kener 已提交
1189 1190 1191
        ontooltipHover : function (param, tipShape) {
            if (!this._lastTipShape // 不存在或者存在但dataIndex发生变化才需要重绘
                || (this._lastTipShape && this._lastTipShape.dataIndex != param.dataIndex)
K
kener 已提交
1192
            ) {
K
kener 已提交
1193 1194
                if (this._lastTipShape && this._lastTipShape.tipShape.length > 0) {
                    this.zr.delShape(this._lastTipShape.tipShape);
K
kener 已提交
1195 1196
                }
                for (var i = 0, l = tipShape.length; i < l; i++) {
K
kener 已提交
1197
                    tipShape[i].zlevel = this._zlevelBase;
K
kener 已提交
1198
                    tipShape[i].style = zrShapeBase.prototype.getHighlightStyle(
K
kener 已提交
1199 1200 1201 1202 1203 1204 1205 1206 1207
                        tipShape[i].style,
                        tipShape[i].highlightStyle
                    );
                    tipShape[i].draggable = false;
                    tipShape[i].hoverable = false;
                    tipShape[i].clickable = false;
                    tipShape[i].ondragend = null;
                    tipShape[i].ondragover = null;
                    tipShape[i].ondrop = null;
K
kener 已提交
1208
                    this.zr.addShape(tipShape[i]);
K
kener 已提交
1209
                }
K
kener 已提交
1210
                this._lastTipShape = {
K
kener 已提交
1211 1212 1213 1214
                    dataIndex : param.dataIndex,
                    tipShape : tipShape
                };
            }
K
kener 已提交
1215
        },
K
kener 已提交
1216
        
K
kener 已提交
1217 1218 1219
        ondragend : function () {
            this._hide();
        },
K
kener 已提交
1220 1221 1222 1223
        
        /**
         * 图例选择
         */
K
kener 已提交
1224 1225 1226
        onlegendSelected : function (param) {
            this._selectedMap = param.selected;
        },
K
kener 已提交
1227
        
K
kener 已提交
1228 1229 1230
        _setSelectedMap : function () {
            if (this.option.legend && this.option.legend.selected) {
                this._selectedMap = this.option.legend.selected;
K
kener 已提交
1231 1232
            }
            else {
K
kener 已提交
1233
                this._selectedMap = {};
K
kener 已提交
1234
            }
K
kener 已提交
1235
        },
K
kener 已提交
1236
        
K
kener 已提交
1237 1238 1239
        _isSelected : function (itemName) {
            if (typeof this._selectedMap[itemName] != 'undefined') {
                return this._selectedMap[itemName];
K
kener 已提交
1240 1241 1242 1243
            }
            else {
                return true; // 没在legend里定义的都为true啊~
            }
K
kener 已提交
1244
        },
K
kener 已提交
1245

K
kener 已提交
1246 1247 1248 1249 1250 1251
        /**
         * 模拟tooltip hover方法
         * {object} params  参数
         *          {seriesIndex: 0, seriesName:'', dataInex:0} line、bar、scatter、k、radar
         *          {seriesIndex: 0, seriesName:'', name:''} map、pie、chord
         */
K
kener 已提交
1252
        showTip : function (params) {
K
kener 已提交
1253 1254 1255 1256 1257
            if (!params) {
                return;
            }
            
            var seriesIndex;
K
kener 已提交
1258
            var series = this.option.series;
K
kener 已提交
1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276
            if (typeof params.seriesIndex != 'undefined') {
                seriesIndex = params.seriesIndex;
            }
            else {
                var seriesName = params.seriesName;
                for (var i = 0, l = series.length; i < l; i++) {
                    if (series[i].name == seriesName) {
                        seriesIndex = i;
                        break;
                    }
                }
            }
            
            var serie = series[seriesIndex];
            if (typeof serie == 'undefined') {
                return;
            }
            var chart = myChart.chart[serie.type];
K
kener 已提交
1277 1278
            var isAxisTrigger = this.deepQuery(
                                    [serie, this.option], 'tooltip.trigger'
K
kener 已提交
1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291
                                ) == 'axis';
            
            if (!chart) {
                return;
            }
            
            if (isAxisTrigger) {
                // axis trigger
                var dataIndex = params.dataIndex;
                switch (chart.type) {
                    case ecConfig.CHART_TYPE_LINE :
                    case ecConfig.CHART_TYPE_BAR :
                    case ecConfig.CHART_TYPE_K :
K
kener 已提交
1292 1293
                        if (typeof this.xAxis == 'undefined' 
                            || typeof this.yAxis == 'undefined'
K
kener 已提交
1294 1295 1296 1297 1298 1299
                            || serie.data.length <= dataIndex
                        ) {
                            return;
                        }
                        var xAxisIndex = serie.xAxisIndex || 0;
                        var yAxisIndex = serie.yAxisIndex || 0;
K
kener 已提交
1300
                        if (this.xAxis.getAxis(xAxisIndex).type 
K
kener 已提交
1301 1302 1303
                            == ecConfig.COMPONENT_TYPE_AXIS_CATEGORY
                        ) {
                            // 横轴是类目
K
kener 已提交
1304 1305 1306
                            this._event = {
                                zrenderX : this.xAxis.getAxis(xAxisIndex).getCoordByIndex(dataIndex),
                                zrenderY : this.grid.getY() + (this.grid.getYend() - this.grid.getY()) / 4
K
kener 已提交
1307 1308 1309 1310
                            };
                        }
                        else {
                            // 纵轴是类目
K
kener 已提交
1311 1312 1313
                            this._event = {
                                zrenderX : this.grid.getX() + (this.grid.getXend() - this.grid.getX()) / 4,
                                zrenderY : this.yAxis.getAxis(yAxisIndex).getCoordByIndex(dataIndex)
K
kener 已提交
1314 1315
                            };
                        }
K
kener 已提交
1316
                        this._showAxisTrigger(
K
kener 已提交
1317 1318 1319 1320 1321 1322
                            xAxisIndex, 
                            yAxisIndex,
                            dataIndex
                        );
                        break;
                    case ecConfig.CHART_TYPE_RADAR :
K
kener 已提交
1323
                        if (typeof this.polar == 'undefined' 
K
kener 已提交
1324 1325 1326 1327 1328
                            || serie.data[0].value.length <= dataIndex
                        ) {
                            return;
                        }
                        var polarIndex = serie.polarIndex || 0;
K
kener 已提交
1329 1330
                        var vector = this.polar.getVector(polarIndex, dataIndex, 'max');
                        this._event = {
K
kener 已提交
1331 1332 1333
                            zrenderX : vector[0],
                            zrenderY : vector[1]
                        };
K
kener 已提交
1334
                        this._showPolarTrigger(
K
kener 已提交
1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355
                            polarIndex, 
                            dataIndex
                        );
                        break;
                }
            }
            else {
                // item trigger
                var shapeList = chart.shapeList;
                var x;
                var y;
                switch (chart.type) {
                    case ecConfig.CHART_TYPE_LINE :
                    case ecConfig.CHART_TYPE_BAR :
                    case ecConfig.CHART_TYPE_K :
                    case ecConfig.CHART_TYPE_SCATTER :
                        var dataIndex = params.dataIndex;
                        for (var i = 0, l = shapeList.length; i < l; i++) {
                            if (ecData.get(shapeList[i], 'seriesIndex') == seriesIndex
                                && ecData.get(shapeList[i], 'dataIndex') == dataIndex
                            ) {
K
kener 已提交
1356
                                this._curTarget = shapeList[i];
K
kener 已提交
1357 1358 1359 1360 1361 1362 1363 1364 1365 1366
                                x = shapeList[i].style.x;
                                y = chart.type != ecConfig.CHART_TYPE_K 
                                    ? shapeList[i].style.y : shapeList[i].style.y[0];
                                break;
                            }
                        }
                        break;
                    case ecConfig.CHART_TYPE_RADAR :
                        var dataIndex = params.dataIndex;
                        for (var i = 0, l = shapeList.length; i < l; i++) {
K
kener 已提交
1367
                            if (shapeList[i].type == 'polygon'
K
kener 已提交
1368 1369 1370
                                && ecData.get(shapeList[i], 'seriesIndex') == seriesIndex
                                && ecData.get(shapeList[i], 'dataIndex') == dataIndex
                            ) {
K
kener 已提交
1371 1372
                                this._curTarget = shapeList[i];
                                var vector = this.polar.getCenter(serie.polarIndex || 0);
K
kener 已提交
1373 1374 1375 1376 1377 1378 1379 1380 1381
                                x = vector[0];
                                y = vector[1];
                                break;
                            }
                        }
                        break;
                    case ecConfig.CHART_TYPE_PIE :
                        var name = params.name;
                        for (var i = 0, l = shapeList.length; i < l; i++) {
K
kener 已提交
1382
                            if (shapeList[i].type == 'sector'
K
kener 已提交
1383 1384 1385
                                && ecData.get(shapeList[i], 'seriesIndex') == seriesIndex
                                && ecData.get(shapeList[i], 'name') == name
                            ) {
K
kener 已提交
1386 1387
                                this._curTarget = shapeList[i];
                                var style = this._curTarget.style;
K
kener 已提交
1388 1389
                                var midAngle = (style.startAngle + style.endAngle) 
                                                / 2 * Math.PI / 180;
K
kener 已提交
1390 1391
                                x = this._curTarget.style.x + Math.cos(midAngle) * style.r / 1.5;
                                y = this._curTarget.style.y - Math.sin(midAngle) * style.r / 1.5;
K
kener 已提交
1392 1393 1394 1395 1396 1397 1398 1399
                                break;
                            }
                        }
                        break;
                    case ecConfig.CHART_TYPE_MAP :
                        var name = params.name;
                        var mapType = serie.mapType;
                        for (var i = 0, l = shapeList.length; i < l; i++) {
K
kener 已提交
1400
                            if (shapeList[i].type == 'text'
K
kener 已提交
1401 1402 1403
                                && shapeList[i]._mapType == mapType
                                && shapeList[i].style._text == name
                            ) {
K
kener 已提交
1404 1405 1406
                                this._curTarget = shapeList[i];
                                x = this._curTarget.style.x + this._curTarget.position[0];
                                y = this._curTarget.style.y + this._curTarget.position[1];
K
kener 已提交
1407 1408 1409 1410 1411 1412 1413
                                break;
                            }
                        }
                        break;
                    case ecConfig.CHART_TYPE_CHORD:
                        var name = params.name;
                        for (var i = 0, l = shapeList.length; i < l; i++) {
K
kener 已提交
1414
                            if (shapeList[i].type == 'sector'
K
kener 已提交
1415 1416
                                && ecData.get(shapeList[i], 'name') == name
                            ) {
K
kener 已提交
1417 1418
                                this._curTarget = shapeList[i];
                                var style = this._curTarget.style;
K
kener 已提交
1419 1420
                                var midAngle = (style.startAngle + style.endAngle) 
                                                / 2 * Math.PI / 180;
K
kener 已提交
1421 1422 1423
                                x = this._curTarget.style.x + Math.cos(midAngle) * (style.r - 2);
                                y = this._curTarget.style.y - Math.sin(midAngle) * (style.r - 2);
                                this.zr.trigger(
K
kener 已提交
1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436
                                    zrConfig.EVENT.MOUSEMOVE,
                                    {
                                        zrenderX : x,
                                        zrenderY : y
                                    }
                                );
                                return;
                            }
                        }
                        break;
                    case ecConfig.CHART_TYPE_FORCE:
                        var name = params.name;
                        for (var i = 0, l = shapeList.length; i < l; i++) {
K
kener 已提交
1437
                            if (shapeList[i].type == 'circle'
K
kener 已提交
1438 1439
                                && ecData.get(shapeList[i], 'name') == name
                            ) {
K
kener 已提交
1440 1441 1442
                                this._curTarget = shapeList[i];
                                x = this._curTarget.position[0];
                                y = this._curTarget.position[1];
K
kener 已提交
1443 1444 1445 1446 1447 1448
                                break;
                            }
                        }
                        break;
                }
                if (typeof x != 'undefined' && typeof y != 'undefined') {
K
kener 已提交
1449
                    this._event = {
K
kener 已提交
1450 1451 1452
                        zrenderX : x,
                        zrenderY : y
                    };
K
kener 已提交
1453 1454 1455
                    this.zr.addHoverShape(this._curTarget);
                    this.zr.refreshHover();
                    this._showItemTrigger();
K
kener 已提交
1456 1457
                }
            }
K
kener 已提交
1458
        },
K
kener 已提交
1459 1460 1461 1462
        
        /**
         * 关闭,公开接口 
         */
K
kener 已提交
1463 1464 1465
        hideTip : function () {
            this._hide();
        },
K
kener 已提交
1466
        
K
kener 已提交
1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494
        init : function (newOption) {
            this._tDom = this._tDom || document.createElement('div');
            this._tDom.style.position = 'absolute';  // 不是多余的,别删!
            this.hasAppend = false;
            
            this._axisLineShape && this.zr.delShape(this._axisLineShape);
            this._axisLineShape = new LineShape({
                zlevel: this._zlevelBase,
                invisible : true,
                hoverable: false
            });
            this.zr.addShape(this._axisLineShape);
            
            this._axisShadowShape && this.zr.delShape(this._axisShadowShape);
            this._axisShadowShape = new LineShape({
                zlevel: 1,                      // grid上,chart下
                invisible : true,
                hoverable: false
            });
            this.zr.addShape(this._axisShadowShape);
            
            this.refresh(newOption);
        },
        
        /**
         * 刷新
         */
        refresh : function (newOption) {
K
kener 已提交
1495 1496 1497 1498 1499
            // this.component;
            // this.grid;
            // this.xAxis;
            // this.yAxis;
            // this.polar;
K
kener 已提交
1500 1501 1502
            // this._selectedMap;
            // this._defaultCssText;    // css样式缓存
            // this._needAxisTrigger;   // 坐标轴触发
K
kener 已提交
1503 1504
            // this._curTarget;
            // this._event;
K
kener 已提交
1505 1506
            // this._curTicket;         // 异步回调标识,用来区分多个请求
            
K
kener 已提交
1507 1508 1509 1510 1511 1512
            // 缓存一些高宽数据
            this._zrHeight = this.zr.getHeight();
            this._zrWidth = this.zr.getWidth();
    
            this._lastTipShape = false;
            
K
kener 已提交
1513
            if (newOption) {
K
kener 已提交
1514 1515 1516 1517 1518
                this.option = newOption;
                this.option.tooltip = this.reformOption(this.option.tooltip);
                this.option.tooltip.textStyle = zrUtil.merge(
                    this.option.tooltip.textStyle,
                    this.ecTheme.textStyle
K
kener 已提交
1519 1520
                );
                // 补全padding属性
K
kener 已提交
1521 1522
                this.option.tooltip.padding = this.reformCssArray(
                    this.option.tooltip.padding
K
kener 已提交
1523
                );
K
kener 已提交
1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542
    
                this._needAxisTrigger = false;
                if (this.option.tooltip.trigger == 'axis') {
                    this._needAxisTrigger = true;
                }
    
                var series = this.option.series;
                for (var i = 0, l = series.length; i < l; i++) {
                    if (this.query(series[i], 'tooltip.trigger') == 'axis') {
                        this._needAxisTrigger = true;
                        break;
                    }
                }
                // this._hidingTicket;
                // this._showingTicket;
                this._showDelay = this.option.tooltip.showDelay; // 显示延迟
                this._hideDelay = this.option.tooltip.hideDelay; // 隐藏延迟
                this._defaultCssText = this._style(this.option.tooltip);
                
K
kener 已提交
1543 1544
                this._setSelectedMap();
                this._axisLineWidth = this.option.tooltip.axisPointer.lineStyle.width;
K
kener 已提交
1545
            }
K
kener 已提交
1546
        },
K
kener 已提交
1547 1548 1549 1550

        /**
         * 释放后实例不可用,重载基类方法
         */
K
kener 已提交
1551 1552 1553 1554 1555
        dispose : function () {
            clearTimeout(this._hidingTicket);
            clearTimeout(this._showingTicket);
            this.zr.un(zrConfig.EVENT.MOUSEMOVE, self._onmousemove);
            this.zr.un(zrConfig.EVENT.GLOBALOUT, self._onglobalout);
K
kener 已提交
1556

K
kener 已提交
1557 1558
            if (this.hasAppend) {
                this.dom.firstChild.removeChild(this._tDom);
K
kener 已提交
1559
            }
K
kener 已提交
1560
            this._tDom = null;
K
kener 已提交
1561

K
kener 已提交
1562 1563 1564
            // this.clear();
            this.shapeList = null;
        },
K
kener 已提交
1565 1566 1567 1568
        
        /**
         * html转码的方法
         */
K
kener 已提交
1569
        _encodeHTML : function (source) {
K
kener 已提交
1570
            return String(source)
K
kener 已提交
1571 1572 1573 1574 1575
                        .replace(/&/g, '&amp;')
                        .replace(/</g, '&lt;')
                        .replace(/>/g, '&gt;')
                        .replace(/"/g, '&quot;')
                        .replace(/'/g, '&#39;');
K
kener 已提交
1576
        }
K
kener 已提交
1577 1578 1579 1580
    };
    
    zrUtil.inherits(Tooltip, Base);
    
1581 1582
    require('../component').define('tooltip', Tooltip);

K
kener 已提交
1583 1584
    return Tooltip;
});