Вход Регистрация
Файл: Main Website Files/assets/bower_components/flot.tooltip/js/jquery.flot.tooltip.js
Строк: 628
<?php
/*
 * jquery.flot.tooltip
 * 
 * description: easy-to-use tooltips for Flot charts
 * version: 0.8.4
 * authors: Krzysztof Urbas @krzysu [myviews.pl],Evan Steinkerchner @Roundaround
 * website: https://github.com/krzysu/flot.tooltip
 * 
 * build on 2014-08-04
 * released under MIT License, 2012
*/ 
(function ($) {
    
// plugin options, default values
    
var defaultOptions = {
        
tooltipfalse,
        
tooltipOpts: {
            
id"flotTip",
            
content"%s | X: %x | Y: %y",
            
// allowed templates are:
            // %s -> series label,
            // %lx -> x axis label (requires flot-axislabels plugin https://github.com/markrcote/flot-axislabels),
            // %ly -> y axis label (requires flot-axislabels plugin https://github.com/markrcote/flot-axislabels),
            // %x -> X value,
            // %y -> Y value,
            // %x.2 -> precision of X value,
            // %p -> percent
            
xDateFormatnull,
            
yDateFormatnull,
            
monthNamesnull,
            
dayNamesnull,
            
shifts: {
                
x10,
                
y20
            
},
            
defaultThemetrue,
            
lines: {
                
trackfalse,
                
threshold0.05
            
},

            
// callbacks
            
onHover: function (flotItem$tooltipEl) {},

            
$compatfalse
        
}
    };

    
// object
    
var FlotTooltip = function (plot) {
        
// variables
        
this.tipPosition = {x0y0};

        
this.init(plot);
    };

    
// main plugin function
    
FlotTooltip.prototype.init = function (plot) {
        var 
that this;

        
// detect other flot plugins
        
var plotPluginsLength = $.plot.plugins.length;
        
this.plotPlugins = [];

        if (
plotPluginsLength) {
            for (var 
0plotPluginsLengthp++) {
                
this.plotPlugins.push($.plot.plugins[p].name);
            }
        }

        
plot.hooks.bindEvents.push(function (ploteventHolder) {

            
// get plot options
            
that.plotOptions plot.getOptions();

            
// if not enabled return
            
if (that.plotOptions.tooltip === false || typeof that.plotOptions.tooltip === 'undefined') return;

            
// shortcut to access tooltip options
            
that.tooltipOptions that.plotOptions.tooltipOpts;

            if (
that.tooltipOptions.$compat) {
                
that.wfunc 'width';
                
that.hfunc 'height';
            } else {
                
that.wfunc 'innerWidth';
                
that.hfunc 'innerHeight';
            }

            
// create tooltip DOM element
            
var $tip that.getDomElement();

            
// bind event
            
$( plot.getPlaceholder() ).bind("plothover"plothover);

            $(
eventHolder).bind('mousemove'mouseMove);
        });

        
plot.hooks.shutdown.push(function (ploteventHolder){
            $(
plot.getPlaceholder()).unbind("plothover"plothover);
            $(
eventHolder).unbind("mousemove"mouseMove);
        });

        function 
mouseMove(e){
            var 
pos = {};
            
pos.e.pageX;
            
pos.e.pageY;
            
plot.setTooltipPosition(pos);
        }

        function 
plothover(eventpositem) {
            
// Simple distance formula.
            
var lineDistance = function (p1xp1yp2xp2y) {
                return 
Math.sqrt((p2x p1x) * (p2x p1x) + (p2y p1y) * (p2y p1y));
            };

            
// Here is some voodoo magic for determining the distance to a line form a given point {x, y}.
            
var dotLineLength = function (xyx0y0x1y1o) {
                if (
&& !(=
                    function (
xyx0y0x1y1) {
                        if (
typeof x0 !== 'undefined') return { xx0y};
                        else if (
typeof y0 !== 'undefined') return { xxyy0 };

                        var 
left,
                            
tg = -/ ((y1 y0) / (x1 x0));

                        return {
                            
xleft = (x1 * (tg y0) + x0 * (* -tg y1)) / (tg * (x1 x0) + y0 y1),
                            
ytg left tg y
                        
};
                    } (
xyx0y0x1y1),
                    
o.>= Math.min(x0x1) && o.<= Math.max(x0x1) && o.>= Math.min(y0y1) && o.<= Math.max(y0y1))
                ) {
                    var 
l1 lineDistance(xyx0y0), l2 lineDistance(xyx1y1);
                    return 
l1 l2 l2 l1;
                } else {
                    var 
y0 y1x1 x0x0 y1 y0 x1;
                    return 
Math.abs(c) / Math.sqrt(b);
                }
            };

            if (
item) {
                
plot.showTooltip(itempos);
            } else if (
that.plotOptions.series.lines.show && that.tooltipOptions.lines.track === true) {
                var 
closestTrace = {
                    
distance: -1
                
};

                $.
each(plot.getData(), function (iseries) {
                    var 
xBeforeIndex 0,
                        
xAfterIndex = -1;

                    
// Our search here assumes our data is sorted via the x-axis.
                    // TODO: Improve efficiency somehow - search smaller sets of data.
                    
for (var 1series.data.lengthj++) {
                        if (
series.data[1][0] <= pos.&& series.data[j][0] >= pos.x) {
                            
xBeforeIndex 1;
                            
xAfterIndex j;
                        }
                    }

                    if (
xAfterIndex === -1) {
                        
plot.hideTooltip();
                        return;
                    }

                    var 
pointPrev = { xseries.data[xBeforeIndex][0], yseries.data[xBeforeIndex][1] },
                        
pointNext = { xseries.data[xAfterIndex][0], yseries.data[xAfterIndex][1] };

                    var 
distToLine dotLineLength(pos.xpos.ypointPrev.xpointPrev.ypointNext.xpointNext.yfalse);

                    if (
distToLine that.tooltipOptions.lines.threshold) {

                        var 
closestIndex lineDistance(pointPrev.xpointPrev.ypos.xpos.y) <
                            
lineDistance(pos.xpos.ypointNext.xpointNext.y) ? xBeforeIndex xAfterIndex;

                        var 
pointSize series.datapoints.pointsize;

                        
// Calculate the point on the line vertically closest to our cursor.
                        
var pointOnLine = [
                            
pos.x,
                            
pointPrev.+ ((pointNext.pointPrev.y) * ((pos.pointPrev.x) / (pointNext.pointPrev.x)))
                        ];

                        var 
item = {
                            
datapointpointOnLine,
                            
dataIndexclosestIndex,
                            
seriesseries,
                            
seriesIndexi
                        
};

                        if (
closestTrace.distance === -|| distToLine closestTrace.distance) {
                            
closestTrace = {
                                
distancedistToLine,
                                
itemitem
                            
};
                        }
                    }
                });

                if (
closestTrace.distance !== -1)
                    
plot.showTooltip(closestTrace.itempos);
                else
                    
plot.hideTooltip();
            } else {
                
plot.hideTooltip();
            }
        }

        
// Quick little function for setting the tooltip position.
        
plot.setTooltipPosition = function (pos) {
            var 
$tip that.getDomElement();

            var 
totalTipWidth $tip.outerWidth() + that.tooltipOptions.shifts.x;
            var 
totalTipHeight $tip.outerHeight() + that.tooltipOptions.shifts.y;
            if ((
pos.- $(window).scrollLeft()) > ($(window)[that.wfunc]() - totalTipWidth)) {
                
pos.-= totalTipWidth;
            }
            if ((
pos.- $(window).scrollTop()) > ($(window)[that.hfunc]() - totalTipHeight)) {
                
pos.-= totalTipHeight;
            }
            
that.tipPosition.pos.x;
            
that.tipPosition.pos.y;
        };

        
// Quick little function for showing the tooltip.
        
plot.showTooltip = function (targetposition) {
            var 
$tip that.getDomElement();

            
// convert tooltip content template to real tipText
            
var tipText that.stringFormat(that.tooltipOptions.contenttarget);

            
$tip.html(tipText);
            
plot.setTooltipPosition({ xposition.pageXyposition.pageY });
            
$tip.css({
                
leftthat.tipPosition.that.tooltipOptions.shifts.x,
                
topthat.tipPosition.that.tooltipOptions.shifts.y
            
}).show();

            
// run callback
            
if (typeof that.tooltipOptions.onHover === 'function') {
                
that.tooltipOptions.onHover(target$tip);
            }
        };

        
// Quick little function for hiding the tooltip.
        
plot.hideTooltip = function () {
            
that.getDomElement().hide().html('');
        };
    };

    
/**
     * get or create tooltip DOM element
     * @return jQuery object
     */
    
FlotTooltip.prototype.getDomElement = function () {
        var 
$tip = $('#' this.tooltipOptions.id);

        if( 
$tip.length === ){
            
$tip = $('<div />').attr('id'this.tooltipOptions.id);
            
$tip.appendTo('body').hide().css({position'absolute'});

            if(
this.tooltipOptions.defaultTheme) {
                
$tip.css({
                    
'background''#fff',
                    
'z-index''1040',
                    
'padding''0.4em 0.6em',
                    
'border-radius''0.5em',
                    
'font-size''0.8em',
                    
'border''1px solid #111',
                    
'display''none',
                    
'white-space''nowrap'
                
});
            }
        }

        return 
$tip;
    };

    
/**
     * core function, create tooltip content
     * @param  {string} content - template with tooltip content
     * @param  {object} item - Flot item
     * @return {string} real tooltip content for current item
     */
    
FlotTooltip.prototype.stringFormat = function (contentitem) {

        var 
percentPattern = /%p.{0,1}(d{0,})/;
        var 
seriesPattern = /%s/;
        var 
xLabelPattern = /%lx/; // requires flot-axislabels plugin https://github.com/markrcote/flot-axislabels, will be ignored if plugin isn't loaded
        
var yLabelPattern = /%ly/; // requires flot-axislabels plugin https://github.com/markrcote/flot-axislabels, will be ignored if plugin isn't loaded
        
var xPattern = /%x.{0,1}(d{0,})/;
        var 
yPattern = /%y.{0,1}(d{0,})/;
        var 
xPatternWithoutPrecision "%x";
        var 
yPatternWithoutPrecision "%y";
        var 
customTextPattern "%ct";

        var 
xycustomTextp;

        
// for threshold plugin we need to read data from different place
        
if (typeof item.series.threshold !== "undefined") {
            
item.datapoint[0];
            
item.datapoint[1];
            
customText item.datapoint[2];
        } else if (
typeof item.series.lines !== "undefined" && item.series.lines.steps) {
            
item.series.datapoints.points[item.dataIndex 2];
            
item.series.datapoints.points[item.dataIndex 1];
            
// TODO: where to find custom text in this variant?
            
customText "";
        } else {
            
item.series.data[item.dataIndex][0];
            
item.series.data[item.dataIndex][1];
            
customText item.series.data[item.dataIndex][2];
        }

        
// I think this is only in case of threshold plugin
        
if (item.series.label === null && item.series.originSeries) {
            
item.series.label item.series.originSeries.label;
        }

        
// if it is a function callback get the content string
        
if (typeof(content) === 'function') {
            
content content(item.series.labelxyitem);
        }

        
// percent match for pie charts and stacked percent
        
if (typeof (item.series.percent) !== 'undefined') {
            
item.series.percent;
        } else if (
typeof (item.series.percents) !== 'undefined') {
            
item.series.percents[item.dataIndex];
        }        
        if (
typeof p === 'number') {
            
content this.adjustValPrecision(percentPatterncontentp);
        }

        
// series match
        
if (typeof(item.series.label) !== 'undefined') {
            
content content.replace(seriesPatternitem.series.label);
        } else {
            
//remove %s if label is undefined
            
content content.replace(seriesPattern"");
        }

        
// x axis label match
        
if (this.hasAxisLabel('xaxis'item)) {
            
content content.replace(xLabelPatternitem.series.xaxis.options.axisLabel);
        } else {
            
//remove %lx if axis label is undefined or axislabels plugin not present
            
content content.replace(xLabelPattern"");
        }

        
// y axis label match
        
if (this.hasAxisLabel('yaxis'item)) {
            
content content.replace(yLabelPatternitem.series.yaxis.options.axisLabel);
        } else {
            
//remove %ly if axis label is undefined or axislabels plugin not present
            
content content.replace(yLabelPattern"");
        }

        
// time mode axes with custom dateFormat
        
if (this.isTimeMode('xaxis'item) && this.isXDateFormat(item)) {
            
content content.replace(xPatternthis.timestampToDate(xthis.tooltipOptions.xDateFormatitem.series.xaxis.options));
        }
        if (
this.isTimeMode('yaxis'item) && this.isYDateFormat(item)) {
            
content content.replace(yPatternthis.timestampToDate(ythis.tooltipOptions.yDateFormatitem.series.yaxis.options));
        }

        
// set precision if defined
        
if (typeof x === 'number') {
            
content this.adjustValPrecision(xPatterncontentx);
        }
        if (
typeof y === 'number') {
            
content this.adjustValPrecision(yPatterncontenty);
        }

        
// change x from number to given label, if given
        
if (typeof item.series.xaxis.ticks !== 'undefined') {

            var 
ticks;
            if (
this.hasRotatedXAxisTicks(item)) {
                
// xaxis.ticks will be an empty array if tickRotor is being used, but the values are available in rotatedTicks
                
ticks 'rotatedTicks';
            } else {
                
ticks 'ticks';
            }

            
// see https://github.com/krzysu/flot.tooltip/issues/65
            
var tickIndex item.dataIndex item.seriesIndex;

            if (
item.series.xaxis[ticks].length tickIndex && !this.isTimeMode('xaxis'item)) {
                var 
valueX = (this.isCategoriesMode('xaxis'item)) ? item.series.xaxis[ticks][tickIndex].label item.series.xaxis[ticks][tickIndex].v;
                if (
valueX === x) {
                    
content content.replace(xPatternitem.series.xaxis[ticks][tickIndex].label);
                }
            }
        }

        
// change y from number to given label, if given
        
if (typeof item.series.yaxis.ticks !== 'undefined') {
            for (var 
index in item.series.yaxis.ticks) {
                if (
item.series.yaxis.ticks.hasOwnProperty(index)) {
                    var 
valueY = (this.isCategoriesMode('yaxis'item)) ? item.series.yaxis.ticks[index].label item.series.yaxis.ticks[index].v;
                    if (
valueY === y) {
                        
content content.replace(yPatternitem.series.yaxis.ticks[index].label);
                    }
                }
            }
        }

        
// if no value customization, use tickFormatter by default
        
if (typeof item.series.xaxis.tickFormatter !== 'undefined') {
            
//escape dollar
            
content content.replace(xPatternWithoutPrecisionitem.series.xaxis.tickFormatter(xitem.series.xaxis).replace(/$/g'$$'));
        }
        if (
typeof item.series.yaxis.tickFormatter !== 'undefined') {
            
//escape dollar
            
content content.replace(yPatternWithoutPrecisionitem.series.yaxis.tickFormatter(yitem.series.yaxis).replace(/$/g'$$'));
        }

        if (
customText)
            
content content.replace(customTextPatterncustomText);

        return 
content;
    };

    
// helpers just for readability
    
FlotTooltip.prototype.isTimeMode = function (axisNameitem) {
        return (
typeof item.series[axisName].options.mode !== 'undefined' && item.series[axisName].options.mode === 'time');
    };

    
FlotTooltip.prototype.isXDateFormat = function (item) {
        return (
typeof this.tooltipOptions.xDateFormat !== 'undefined' && this.tooltipOptions.xDateFormat !== null);
    };

    
FlotTooltip.prototype.isYDateFormat = function (item) {
        return (
typeof this.tooltipOptions.yDateFormat !== 'undefined' && this.tooltipOptions.yDateFormat !== null);
    };

    
FlotTooltip.prototype.isCategoriesMode = function (axisNameitem) {
        return (
typeof item.series[axisName].options.mode !== 'undefined' && item.series[axisName].options.mode === 'categories');
    };

    
//
    
FlotTooltip.prototype.timestampToDate = function (tmstdateFormatoptions) {
        var 
theDate = $.plot.dateGenerator(tmstoptions);
        return $.
plot.formatDate(theDatedateFormatthis.tooltipOptions.monthNamesthis.tooltipOptions.dayNames);
    };

    
//
    
FlotTooltip.prototype.adjustValPrecision = function (patterncontentvalue) {

        var 
precision;
        var 
matchResult content.match(pattern);
        if( 
matchResult !== null ) {
            if(
RegExp.$!== '') {
                
precision RegExp.$1;
                
value value.toFixed(precision);

                
// only replace content if precision exists, in other case use thickformater
                
content content.replace(patternvalue);
            }
        }
        return 
content;
    };

    
// other plugins detection below

    // check if flot-axislabels plugin (https://github.com/markrcote/flot-axislabels) is used and that an axis label is given
    
FlotTooltip.prototype.hasAxisLabel = function (axisNameitem) {
        return ($.
inArray(this.plotPlugins'axisLabels') !== -&& typeof item.series[axisName].options.axisLabel !== 'undefined' && item.series[axisName].options.axisLabel.length 0);
    };

    
// check whether flot-tickRotor, a plugin which allows rotation of X-axis ticks, is being used
    
FlotTooltip.prototype.hasRotatedXAxisTicks = function (item) {
        return ($.
inArray(this.plotPlugins'tickRotor') !== -&& typeof item.series.xaxis.rotatedTicks !== 'undefined');
    };

    
//
    
var init = function (plot) {
      new 
FlotTooltip(plot);
    };

    
// define Flot plugin
    
$.plot.plugins.push({
        
initinit,
        
optionsdefaultOptions,
        
name'tooltip',
        
version'0.8.4'
    
});

})(
jQuery);
?>
Онлайн: 0
Реклама