assets/javascripts/bootstrap/tooltip.js
author ymh <ymh.work@gmail.com>
Thu, 15 Jun 2017 12:17:09 +0200
changeset 114 af15590802a4
permissions -rw-r--r--
add a lot of files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
114
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
/* ========================================================================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
 * Bootstrap: tooltip.js v3.3.5
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
 * http://getbootstrap.com/javascript/#tooltip
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * Inspired by the original jQuery.tipsy by Jason Frame
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * ========================================================================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * Copyright 2011-2015 Twitter, Inc.
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * ======================================================================== */
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
+function ($) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
  'use strict';
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
  // TOOLTIP PUBLIC CLASS DEFINITION
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
  // ===============================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
  var Tooltip = function (element, options) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
    this.type       = null
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    this.options    = null
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    this.enabled    = null
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    this.timeout    = null
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
    this.hoverState = null
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    this.$element   = null
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    this.inState    = null
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    this.init('tooltip', element, options)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
  Tooltip.VERSION  = '3.3.5'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
  Tooltip.TRANSITION_DURATION = 150
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
  Tooltip.DEFAULTS = {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    animation: true,
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    placement: 'top',
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    selector: false,
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    trigger: 'hover focus',
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    title: '',
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    delay: 0,
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    html: false,
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
    container: false,
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
    viewport: {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
      selector: 'body',
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
      padding: 0
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
  Tooltip.prototype.init = function (type, element, options) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
    this.enabled   = true
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    this.type      = type
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
    this.$element  = $(element)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    this.options   = this.getOptions(options)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
    this.inState   = { click: false, hover: false, focus: false }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
    var triggers = this.options.trigger.split(' ')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
    for (var i = triggers.length; i--;) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
      var trigger = triggers[i]
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
      if (trigger == 'click') {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
      } else if (trigger != 'manual') {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
      }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
    this.options.selector ?
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
      this.fixTitle()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
  Tooltip.prototype.getDefaults = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
    return Tooltip.DEFAULTS
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
  Tooltip.prototype.getOptions = function (options) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
    if (options.delay && typeof options.delay == 'number') {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
      options.delay = {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
        show: options.delay,
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
        hide: options.delay
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
      }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
    return options
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
  Tooltip.prototype.getDelegateOptions = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
    var options  = {}
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
    var defaults = this.getDefaults()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
    this._options && $.each(this._options, function (key, value) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
      if (defaults[key] != value) options[key] = value
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
    })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
    return options
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
  Tooltip.prototype.enter = function (obj) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
    var self = obj instanceof this.constructor ?
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
      obj : $(obj.currentTarget).data('bs.' + this.type)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
    if (!self) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
      $(obj.currentTarget).data('bs.' + this.type, self)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
    if (obj instanceof $.Event) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    if (self.tip().hasClass('in') || self.hoverState == 'in') {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
      self.hoverState = 'in'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
      return
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
    clearTimeout(self.timeout)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
    self.hoverState = 'in'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
    if (!self.options.delay || !self.options.delay.show) return self.show()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
    self.timeout = setTimeout(function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
      if (self.hoverState == 'in') self.show()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
    }, self.options.delay.show)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
  Tooltip.prototype.isInStateTrue = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
    for (var key in this.inState) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
      if (this.inState[key]) return true
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
    return false
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
  Tooltip.prototype.leave = function (obj) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
    var self = obj instanceof this.constructor ?
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
      obj : $(obj.currentTarget).data('bs.' + this.type)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
    if (!self) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
      $(obj.currentTarget).data('bs.' + this.type, self)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
    if (obj instanceof $.Event) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
    if (self.isInStateTrue()) return
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
    clearTimeout(self.timeout)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
    self.hoverState = 'out'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
    if (!self.options.delay || !self.options.delay.hide) return self.hide()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
    self.timeout = setTimeout(function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
      if (self.hoverState == 'out') self.hide()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
    }, self.options.delay.hide)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
  Tooltip.prototype.show = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
    var e = $.Event('show.bs.' + this.type)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
    if (this.hasContent() && this.enabled) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
      this.$element.trigger(e)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
      if (e.isDefaultPrevented() || !inDom) return
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
      var that = this
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
      var $tip = this.tip()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
      var tipId = this.getUID(this.type)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
      this.setContent()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
      $tip.attr('id', tipId)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
      this.$element.attr('aria-describedby', tipId)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
      if (this.options.animation) $tip.addClass('fade')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
      var placement = typeof this.options.placement == 'function' ?
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
        this.options.placement.call(this, $tip[0], this.$element[0]) :
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
        this.options.placement
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
      var autoToken = /\s?auto?\s?/i
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
      var autoPlace = autoToken.test(placement)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
      $tip
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
        .detach()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
        .css({ top: 0, left: 0, display: 'block' })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
        .addClass(placement)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
        .data('bs.' + this.type, this)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
      this.$element.trigger('inserted.bs.' + this.type)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
      var pos          = this.getPosition()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
      var actualWidth  = $tip[0].offsetWidth
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
      var actualHeight = $tip[0].offsetHeight
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
      if (autoPlace) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
        var orgPlacement = placement
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
        var viewportDim = this.getPosition(this.$viewport)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
                    placement
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
        $tip
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
          .removeClass(orgPlacement)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
          .addClass(placement)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
      }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
      this.applyPlacement(calculatedOffset, placement)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
      var complete = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
        var prevHoverState = that.hoverState
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
        that.$element.trigger('shown.bs.' + that.type)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
        that.hoverState = null
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
        if (prevHoverState == 'out') that.leave(that)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
      }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
      $.support.transition && this.$tip.hasClass('fade') ?
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
        $tip
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
          .one('bsTransitionEnd', complete)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
        complete()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
  Tooltip.prototype.applyPlacement = function (offset, placement) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
    var $tip   = this.tip()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
    var width  = $tip[0].offsetWidth
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
    var height = $tip[0].offsetHeight
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
    // manually read margins because getBoundingClientRect includes difference
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
    var marginTop = parseInt($tip.css('margin-top'), 10)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
    var marginLeft = parseInt($tip.css('margin-left'), 10)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
    // we must check for NaN for ie 8/9
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
    if (isNaN(marginTop))  marginTop  = 0
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
    if (isNaN(marginLeft)) marginLeft = 0
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
    offset.top  += marginTop
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
    offset.left += marginLeft
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
    // $.fn.offset doesn't round pixel values
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
    // so we use setOffset directly with our own function B-0
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
    $.offset.setOffset($tip[0], $.extend({
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
      using: function (props) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
        $tip.css({
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
          top: Math.round(props.top),
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
          left: Math.round(props.left)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
        })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
      }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
    }, offset), 0)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
    $tip.addClass('in')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
    // check to see if placing tip in new offset caused the tip to resize itself
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
    var actualWidth  = $tip[0].offsetWidth
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
    var actualHeight = $tip[0].offsetHeight
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
    if (placement == 'top' && actualHeight != height) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
      offset.top = offset.top + height - actualHeight
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
    if (delta.left) offset.left += delta.left
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
    else offset.top += delta.top
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
    var isVertical          = /top|bottom/.test(placement)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
    $tip.offset(offset)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
    this.arrow()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
      .css(isVertical ? 'top' : 'left', '')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
  Tooltip.prototype.setContent = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
    var $tip  = this.tip()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
    var title = this.getTitle()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
    $tip.removeClass('fade in top bottom left right')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
  Tooltip.prototype.hide = function (callback) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
    var that = this
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
    var $tip = $(this.$tip)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
    var e    = $.Event('hide.bs.' + this.type)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
    function complete() {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
      if (that.hoverState != 'in') $tip.detach()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
      that.$element
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
        .removeAttr('aria-describedby')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
        .trigger('hidden.bs.' + that.type)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
      callback && callback()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
    this.$element.trigger(e)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
    if (e.isDefaultPrevented()) return
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
    $tip.removeClass('in')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
    $.support.transition && $tip.hasClass('fade') ?
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
      $tip
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
        .one('bsTransitionEnd', complete)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
      complete()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
    this.hoverState = null
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
    return this
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
  Tooltip.prototype.fixTitle = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
    var $e = this.$element
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
  Tooltip.prototype.hasContent = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
    return this.getTitle()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
  Tooltip.prototype.getPosition = function ($element) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
    $element   = $element || this.$element
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
    var el     = $element[0]
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
    var isBody = el.tagName == 'BODY'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
    var elRect    = el.getBoundingClientRect()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
    if (elRect.width == null) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
    return $.extend({}, elRect, scroll, outerDims, elOffset)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
    var delta = { top: 0, left: 0 }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
    if (!this.$viewport) return delta
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
    var viewportDimensions = this.getPosition(this.$viewport)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
    if (/right|left/.test(placement)) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
      if (topEdgeOffset < viewportDimensions.top) { // top overflow
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
        delta.top = viewportDimensions.top - topEdgeOffset
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
      }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
    } else {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
      var leftEdgeOffset  = pos.left - viewportPadding
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
        delta.left = viewportDimensions.left - leftEdgeOffset
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
      }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
    return delta
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
  Tooltip.prototype.getTitle = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
    var title
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
    var $e = this.$element
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
    var o  = this.options
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
    title = $e.attr('data-original-title')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
    return title
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
  Tooltip.prototype.getUID = function (prefix) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
    do prefix += ~~(Math.random() * 1000000)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
    while (document.getElementById(prefix))
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
    return prefix
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
  Tooltip.prototype.tip = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
    if (!this.$tip) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
      this.$tip = $(this.options.template)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
      if (this.$tip.length != 1) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
      }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
    return this.$tip
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
  Tooltip.prototype.arrow = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
  Tooltip.prototype.enable = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
    this.enabled = true
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
  Tooltip.prototype.disable = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
    this.enabled = false
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
  Tooltip.prototype.toggleEnabled = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
    this.enabled = !this.enabled
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
  Tooltip.prototype.toggle = function (e) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
    var self = this
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
    if (e) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
      self = $(e.currentTarget).data('bs.' + this.type)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
      if (!self) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
        $(e.currentTarget).data('bs.' + this.type, self)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
      }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
    if (e) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
      self.inState.click = !self.inState.click
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
      if (self.isInStateTrue()) self.enter(self)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
      else self.leave(self)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
    } else {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
  Tooltip.prototype.destroy = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
    var that = this
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
    clearTimeout(this.timeout)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
    this.hide(function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
      that.$element.off('.' + that.type).removeData('bs.' + that.type)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
      if (that.$tip) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
        that.$tip.detach()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
      }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
      that.$tip = null
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
      that.$arrow = null
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
      that.$viewport = null
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
    })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
  // TOOLTIP PLUGIN DEFINITION
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
  // =========================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
  function Plugin(option) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
    return this.each(function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
      var $this   = $(this)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
      var data    = $this.data('bs.tooltip')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
      var options = typeof option == 'object' && option
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
      if (!data && /destroy|hide/.test(option)) return
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
      if (typeof option == 'string') data[option]()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
    })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
  var old = $.fn.tooltip
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
  $.fn.tooltip             = Plugin
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
  $.fn.tooltip.Constructor = Tooltip
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
  // TOOLTIP NO CONFLICT
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
  // ===================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
  $.fn.tooltip.noConflict = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
    $.fn.tooltip = old
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
    return this
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
}(jQuery);