Вход Регистрация
Файл: static/library/plugins/bootstrap-slider/bootstrap-slider.js
Строк: 1408
<?php
/*! =========================================================
 * bootstrap-slider.js
 *
 * Maintainers: 
 *        Kyle Kemp 
 *            - Twitter: @seiyria
 *            - Github:  seiyria
 *        Rohit Kalkur
 *            - Twitter: @Rovolutionary
 *            - Github:  rovolution
 *
 * =========================================================
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ========================================================= */


/**
 * Bridget makes jQuery widgets
 * v1.0.1
 * MIT license
 */
( function( $ ) {

    ( function( $ ) {

        
'use strict';

        
// -------------------------- utils -------------------------- //

        
var slice = Array.prototype.slice;

        function 
noop() {}

        
// -------------------------- definition -------------------------- //

        
function defineBridget( $ ) {

            
// bail if no jQuery
            
if ( !$ ) {
                return;
            }

            
// -------------------------- addOptionMethod -------------------------- //

            /**
             * adds option method -> $().plugin('option', {...})
             * @param {Function} PluginClass - constructor class
             */
            
function addOptionMethodPluginClass ) {
                
// don't overwrite original option method
                
if ( PluginClass.prototype.option ) {
                    return;
                }

              
// option setter
              
PluginClass.prototype.option = function( opts ) {
                
// bail out if not an object
                
if ( !$.isPlainObjectopts ) ){
                  return;
                }
                
this.options = $.extendtruethis.optionsopts );
              };
            }


            
// -------------------------- plugin bridge -------------------------- //

            // helper function for logging errors
            // $.error breaks jQuery chaining
            
var logError typeof console === 'undefined' noop :
              function( 
message ) {
                
console.errormessage );
              };

            
/**
             * jQuery plugin bridge, access methods like $elem.plugin('method')
             * @param {String} namespace - plugin name
             * @param {Function} PluginClass - constructor class
             */
            
function bridge( namespace, PluginClass ) {
              
// add to jQuery fn namespace
              
$.fn[ namespace ] = function( options ) {
                if ( 
typeof options === 'string' ) {
                  
// call plugin method when first argument is a string
                  // get arguments for method
                  
var args slice.callarguments);

                  for ( var 
i=0len this.lengthleni++ ) {
                    var 
elem this[i];
                    var 
instance = $.dataelem, namespace );
                    if ( !
instance ) {
                      
logError"cannot call methods on " + namespace + " prior to initialization; " +
                        
"attempted to call '" options "'" );
                      continue;
                    }
                    if ( !$.
isFunctioninstance[options] ) || options.charAt(0) === '_' ) {
                      
logError"no such method '" options "' for " + namespace + " instance" );
                      continue;
                    }

                    
// trigger method with arguments
                    
var returnValue instanceoptions ].applyinstanceargs);

                    
// break look and return first value if provided
                    
if ( returnValue !== undefined && returnValue !== instance) {
                      return 
returnValue;
                    }
                  }
                  
// return this if no return value
                  
return this;
                } else {
                  var 
objects this.map( function() {
                    var 
instance = $.datathis, namespace );
                    if ( 
instance ) {
                      
// apply options & init
                      
instance.optionoptions );
                      
instance._init();
                    } else {
                      
// initialize new instance
                      
instance = new PluginClassthisoptions );
                      $.
datathis, namespace, instance );
                    }
                    return $(
this);
                  });

                  if(!
objects || objects.length 1) {
                      return 
objects;
                  } else {
                      return 
objects[0];
                  }
                }
              };

            }

            
// -------------------------- bridget -------------------------- //

            /**
             * converts a Prototypical class into a proper jQuery plugin
             *   the class must have a ._init method
             * @param {String} namespace - plugin name, used in $().pluginName
             * @param {Function} PluginClass - constructor class
             */
            
$.bridget = function( namespace, PluginClass ) {
              
addOptionMethodPluginClass );
              
bridge( namespace, PluginClass );
            };

            return $.
bridget;

        }

          
// get jquery from browser global
          
defineBridget( $ );

    })( $ );


    
/*************************************************
                    
            BOOTSTRAP-SLIDER SOURCE CODE

    **************************************************/

    
(function( $ ) {

        var 
ErrorMsgs = {
            
formatInvalidInputErrorMsg : function(input) {
                return 
"Invalid input value '" input "' passed in";
            },
            
callingContextNotSliderInstance "Calling context element does not have instance of Slider bound to it. Check your code to make sure the JQuery object returned from the call to the slider() initializer is calling the method"
        
};



        
/*************************************************
                        
                            CONSTRUCTOR

        **************************************************/
        
var Slider = function(elementoptions) {
            
createNewSlider.call(thiselementoptions);
            return 
this;
        };

        function 
createNewSlider(elementoptions) {
            
/*************************************************
                        
                            Create Markup

            **************************************************/
            
if(typeof element === "string") {
                
this.element document.querySelector(element);
            } else if(
element instanceof HTMLElement) {
                
this.element element;
            }
            
            var 
origWidth this.element.style.width;
            var 
updateSlider false;
            var 
parent this.element.parentNode;
            var 
sliderTrackSelection;
            var 
sliderMinHandle;
            var 
sliderMaxHandle;

            if (
this.sliderElem) {
                
updateSlider true;
            } else {
                
/* Create elements needed for slider */
                
this.sliderElem document.createElement("div");
                
this.sliderElem.className "slider";

                
/* Create slider track elements */
                
var sliderTrack document.createElement("div");
                
sliderTrack.className "slider-track";

                
sliderTrackSelection document.createElement("div");
                
sliderTrackSelection.className "slider-selection";

                
sliderMinHandle document.createElement("div");
                
sliderMinHandle.className "slider-handle min-slider-handle";

                
sliderMaxHandle document.createElement("div");
                
sliderMaxHandle.className "slider-handle max-slider-handle";

                
sliderTrack.appendChild(sliderTrackSelection);
                
sliderTrack.appendChild(sliderMinHandle);
                
sliderTrack.appendChild(sliderMaxHandle);

                var 
createAndAppendTooltipSubElements = function(tooltipElem) {
                    var 
arrow document.createElement("div");
                    
arrow.className "tooltip-arrow";

                    var 
inner document.createElement("div");
                    
inner.className "tooltip-inner";

                    
tooltipElem.appendChild(arrow);
                    
tooltipElem.appendChild(inner);
                };

                
/* Create tooltip elements */
                
var sliderTooltip document.createElement("div");
                
sliderTooltip.className "tooltip tooltip-main";
                
createAndAppendTooltipSubElements(sliderTooltip);

                var 
sliderTooltipMin document.createElement("div");
                
sliderTooltipMin.className "tooltip tooltip-min";
                
createAndAppendTooltipSubElements(sliderTooltipMin);

                var 
sliderTooltipMax document.createElement("div");
                
sliderTooltipMax.className "tooltip tooltip-max";
                
createAndAppendTooltipSubElements(sliderTooltipMax);


                
/* Append components to sliderElem */
                
this.sliderElem.appendChild(sliderTrack);
                
this.sliderElem.appendChild(sliderTooltip);
                
this.sliderElem.appendChild(sliderTooltipMin);
                
this.sliderElem.appendChild(sliderTooltipMax);

                
/* Append slider element to parent container, right before the original <input> element */
                
parent.insertBefore(this.sliderElemthis.element);
                
                
/* Hide original <input> element */
                
this.element.style.display "none";
            }
            
/* If JQuery exists, cache JQ references */
            
if($) {
                
this.$element = $(this.element);
                
this.$sliderElem = $(this.sliderElem);
            }

            
/*************************************************
                        
                            Process Options

            **************************************************/
            
options options options : {};
            var 
optionTypes Object.keys(this.defaultOptions);

            for(var 
0optionTypes.lengthi++) {
                var 
optName optionTypes[i];

                
// First check if an option was passed in via the constructor
                
var val options[optName];
                
// If no data attrib, then check data atrributes
                
val = (typeof val !== 'undefined') ? val getDataAttrib(this.elementoptName);
                
// Finally, if nothing was specified, use the defaults
                
val = (val !== null) ? val this.defaultOptions[optName];

                
// Set all options on the instance of the Slider
                
if(!this.options) {
                    
this.options = {};
                }
                
this.options[optName] = val;
            }

            function 
getDataAttrib(elementoptName) {
                var 
dataName "data-slider-" optName;
                var 
dataValString element.getAttribute(dataName);
                
                try {
                    return 
JSON.parse(dataValString);
                }
                catch(
err) {
                    return 
dataValString;
                }
            }

            
/*************************************************
                        
                                Setup

            **************************************************/
            
this.eventToCallbackMap = {};
            
this.sliderElem.id this.options.id;

            
this.touchCapable 'ontouchstart' in window || (window.DocumentTouch && document instanceof window.DocumentTouch);

            
this.tooltip this.sliderElem.querySelector('.tooltip-main');
            
this.tooltipInner this.tooltip.querySelector('.tooltip-inner');

            
this.tooltip_min this.sliderElem.querySelector('.tooltip-min');
            
this.tooltipInner_min this.tooltip_min.querySelector('.tooltip-inner');

            
this.tooltip_max this.sliderElem.querySelector('.tooltip-max');
            
this.tooltipInner_maxthis.tooltip_max.querySelector('.tooltip-inner');

            if (
updateSlider === true) {
                
// Reset classes
                
this._removeClass(this.sliderElem'slider-horizontal');
                
this._removeClass(this.sliderElem'slider-vertical');
                
this._removeClass(this.tooltip'hide');
                
this._removeClass(this.tooltip_min'hide');
                
this._removeClass(this.tooltip_max'hide');

                
// Undo existing inline styles for track
                
["left""top""width""height"].forEach(function(prop) {
                    
this._removeProperty(this.trackSelectionprop);
                }, 
this);

                
// Undo inline styles on handles
                
[this.handle1this.handle2].forEach(function(handle) {
                    
this._removeProperty(handle'left');
                    
this._removeProperty(handle'top');    
                }, 
this);

                
// Undo inline styles and classes on tooltips
                
[this.tooltipthis.tooltip_minthis.tooltip_max].forEach(function(tooltip) {
                    
this._removeProperty(tooltip'left');
                    
this._removeProperty(tooltip'top');
                    
this._removeProperty(tooltip'margin-left');
                    
this._removeProperty(tooltip'margin-top');

                    
this._removeClass(tooltip'right');
                    
this._removeClass(tooltip'top');
                }, 
this);
            }

            if(
this.options.orientation === 'vertical') {
                
this._addClass(this.sliderElem,'slider-vertical');
                
                
this.stylePos 'top';
                
this.mousePos 'pageY';
                
this.sizePos 'offsetHeight';

                
this._addClass(this.tooltip'right');
                
this.tooltip.style.left '100%';
                
                
this._addClass(this.tooltip_min'right');
                
this.tooltip_min.style.left '100%';

                
this._addClass(this.tooltip_max'right');
                
this.tooltip_max.style.left '100%';
            } else {
                
this._addClass(this.sliderElem'slider-horizontal');
                
this.sliderElem.style.width origWidth;

                
this.options.orientation 'horizontal';
                
this.stylePos 'left';
                
this.mousePos 'pageX';
                
this.sizePos 'offsetWidth';
                
                
this._addClass(this.tooltip'top');
                
this.tooltip.style.top = -this.tooltip.outerHeight 14 'px';
                
                
this._addClass(this.tooltip_min'top');
                
this.tooltip_min.style.top = -this.tooltip_min.outerHeight 14 'px';

                
this._addClass(this.tooltip_max'top');
                
this.tooltip_max.style.top = -this.tooltip_max.outerHeight 14 'px';
            }

            if (
this.options.value instanceof Array) {
                
this.options.range true;
            } else if (
this.options.range) {
                
// User wants a range, but value is not an array
                
this.options.value = [this.options.valuethis.options.max];
            }

            
this.trackSelection sliderTrackSelection || this.trackSelection;
            if (
this.options.selection === 'none') {
                
this._addClass(this.trackSelection'hide');
            }

            
this.handle1 sliderMinHandle || this.handle1;
            
this.handle2 sliderMaxHandle || this.handle2;

            if (
updateSlider === true) {
                
// Reset classes
                
this._removeClass(this.handle1'round triangle');
                
this._removeClass(this.handle2'round triangle hide');
            }

            var 
availableHandleModifiers = ['round''triangle''custom'];
            var 
isValidHandleType availableHandleModifiers.indexOf(this.options.handle) !== -1;
            if (
isValidHandleType) {
                
this._addClass(this.handle1this.options.handle);
                
this._addClass(this.handle2this.options.handle);
            }

            
this.offset this._offset(this.sliderElem);
            
this.size this.sliderElem[this.sizePos];
            
this.setValue(this.options.value);

            
/******************************************
                        
                        Bind Event Listeners

            ******************************************/

            // Bind keyboard handlers
            
this.handle1Keydown this._keydown.bind(this0);
            
this.handle1.addEventListener("keydown"this.handle1Keydownfalse);

            
this.handle2Keydown this._keydown.bind(this0);
            
this.handle2.addEventListener("keydown"this.handle2Keydownfalse);

            if (
this.touchCapable) {
                
// Bind touch handlers
                
this.mousedown this._mousedown.bind(this);
                
this.sliderElem.addEventListener("touchstart"this.mousedownfalse);
            } else {
                
// Bind mouse handlers
                
this.mousedown this._mousedown.bind(this);
                
this.sliderElem.addEventListener("mousedown"this.mousedownfalse);
            }

            
// Bind tooltip-related handlers
            
if(this.options.tooltip === 'hide') {
                
this._addClass(this.tooltip'hide');
                
this._addClass(this.tooltip_min'hide');
                
this._addClass(this.tooltip_max'hide');
            } else if(
this.options.tooltip === 'always') {
                
this._showTooltip();
                
this._alwaysShowTooltip true;
            } else {
                
this.showTooltip this._showTooltip.bind(this);
                
this.hideTooltip this._hideTooltip.bind(this);

                
this.sliderElem.addEventListener("mouseenter"this.showTooltipfalse);
                
this.sliderElem.addEventListener("mouseleave"this.hideTooltipfalse);

                
this.handle1.addEventListener("focus"this.showTooltipfalse);
                
this.handle1.addEventListener("blur"this.hideTooltipfalse);

                
this.handle2.addEventListener("focus"this.showTooltipfalse);
                
this.handle2.addEventListener("blur"this.hideTooltipfalse);
            }

            if(
this.options.enabled) {
                
this.enable();
            } else {
                
this.disable();
            }
        }

        
/*************************************************
                        
                    INSTANCE PROPERTIES/METHODS

        - Any methods bound to the prototype are considered 
        part of the plugin's `public` interface

        **************************************************/
        
Slider.prototype = {
            
_init: function() {}, // NOTE: Must exist to support bridget

            
constructorSlider,

            
defaultOptions: {
                
id"",
                  
min0,
                
max10,
                
step1,
                
precision0,
                
orientation'horizontal',
                
value5,
                
rangefalse,
                
selection'before',
                
tooltip'show',
                
tooltip_splitfalse,
                
handle'round',
                
reversedfalse,
                
enabledtrue,
                
formatter: function(val) {
                    if(
val instanceof Array) {
                        return 
val[0] + " : " val[1];
                    } else {
                        return 
val;
                    }
                },
                
natural_arrow_keysfalse
            
},
            
            
overfalse,
            
            
inDragfalse,

            
getValue: function() {
                if (
this.options.range) {
                    return 
this.options.value;
                }
                return 
this.options.value[0];
            },

            
setValue: function(valtriggerSlideEvent) {
                if (!
val) {
                    
val 0;
                }
                
this.options.value this._validateInputValue(val);
                var 
applyPrecision this._applyPrecision.bind(this);

                if (
this.options.range) {
                    
this.options.value[0] = applyPrecision(this.options.value[0]);
                    
this.options.value[1] = applyPrecision(this.options.value[1]); 

                    
this.options.value[0] = Math.max(this.options.minMath.min(this.options.maxthis.options.value[0]));
                    
this.options.value[1] = Math.max(this.options.minMath.min(this.options.maxthis.options.value[1]));
                } else {
                    
this.options.value applyPrecision(this.options.value);
                    
this.options.value = [ Math.max(this.options.minMath.min(this.options.maxthis.options.value))];
                    
this._addClass(this.handle2'hide');
                    if (
this.options.selection === 'after') {
                        
this.options.value[1] = this.options.max;
                    } else {
                        
this.options.value[1] = this.options.min;
                    }
                }

                
this.diff this.options.max this.options.min;
                if (
this.diff 0) {
                    
this.percentage = [
                        (
this.options.value[0] - this.options.min) * 100 this.diff,
                        (
this.options.value[1] - this.options.min) * 100 this.diff,
                        
this.options.step 100 this.diff
                    
];
                } else {
                    
this.percentage = [00100];
                }

                
this._layout();

                var 
sliderValue this.options.range this.options.value this.options.value[0];
                
this._setDataVal(sliderValue);

                if(
triggerSlideEvent === true) {
                    
this._trigger('slide'sliderValue);
                }

                return 
this;
            },

            
destroy: function(){
                
// Remove event handlers on slider elements
                
this._removeSliderEventHandlers();

                
// Remove the slider from the DOM
                
this.sliderElem.parentNode.removeChild(this.sliderElem);
                
/* Show original <input> element */
                
this.element.style.display "";

                
// Clear out custom event bindings
                
this._cleanUpEventCallbacksMap();

                
// Remove data values
                
this.element.removeAttribute("data");

                
// Remove JQuery handlers/data
                
if($) {
                    
this._unbindJQueryEventHandlers();
                    
this.$element.removeData('slider');
                }
            },

            
disable: function() {
                
this.options.enabled false;
                
this.handle1.removeAttribute("tabindex");
                
this.handle2.removeAttribute("tabindex");
                
this._addClass(this.sliderElem'slider-disabled');
                
this._trigger('slideDisabled');

                return 
this;
            },

            
enable: function() {
                
this.options.enabled true;
                
this.handle1.setAttribute("tabindex"0);
                
this.handle2.setAttribute("tabindex"0);
                
this._removeClass(this.sliderElem'slider-disabled');
                
this._trigger('slideEnabled');

                return 
this;
            },

            
toggle: function() {
                if(
this.options.enabled) {
                    
this.disable();
                } else {
                    
this.enable();
                }

                return 
this;
            },

            
isEnabled: function() {
                return 
this.options.enabled;
            },

            
on: function(evtcallback) {
                if($) {
                    
this.$element.on(evtcallback);
                    
this.$sliderElem.on(evtcallback);
                } else {
                    
this._bindNonQueryEventHandler(evtcallback);
                }
                return 
this;
            },

            
getAttribute: function(attribute) {
                if(
attribute) {
                    return 
this.options[attribute];        
                } else {
                    return 
this.options;
                }
            },

            
setAttribute: function(attributevalue) {
                
this.options[attribute] = value;
                return 
this;
            },

            
refresh: function() {
                
this._removeSliderEventHandlers();
                
createNewSlider.call(thisthis.elementthis.options);
                if($) {
                    
// Bind new instance of slider to the element
                    
$.data(this.element'slider'this);
                }
                return 
this;
            },
            
            
/******************************+
                    
                        HELPERS

            - Any method that is not part of the public interface.
            - Place it underneath this comment block and write its signature like so:

                                  _fnName : function() {...}

            ********************************/
            
_removeSliderEventHandlers: function() {
                
// Remove event listeners from handle1
                
this.handle1.removeEventListener("keydown"this.handle1Keydownfalse);
                
this.handle1.removeEventListener("focus"this.showTooltipfalse);
                
this.handle1.removeEventListener("blur"this.hideTooltipfalse);

                
// Remove event listeners from handle2
                
this.handle2.removeEventListener("keydown"this.handle2Keydownfalse);
                
this.handle2.removeEventListener("focus"this.handle2Keydownfalse);
                
this.handle2.removeEventListener("blur"this.handle2Keydownfalse);

                
// Remove event listeners from sliderElem
                
this.sliderElem.removeEventListener("mouseenter"this.showTooltipfalse);
                
this.sliderElem.removeEventListener("mouseleave"this.hideTooltipfalse);
                
this.sliderElem.removeEventListener("touchstart"this.mousedownfalse);
                
this.sliderElem.removeEventListener("mousedown"this.mousedownfalse);
            },
            
_bindNonQueryEventHandler: function(evtcallback) {
                if(
this.eventToCallbackMap[evt]===undefined) {
                    
this.eventToCallbackMap[evt] = [];
                }
                
this.eventToCallbackMap[evt].push(callback);
            },
            
_cleanUpEventCallbacksMap: function() {
                var 
eventNames Object.keys(this.eventToCallbackMap);
                for(var 
0eventNames.lengthi++) {
                    var 
eventName eventNames[i];
                    
this.eventToCallbackMap[eventName] = null;
                }
            },
            
_showTooltip: function() {
                if (
this.options.tooltip_split === false ){
                    
this._addClass(this.tooltip'in');
                } else {
                    
this._addClass(this.tooltip_min'in');
                    
this._addClass(this.tooltip_max'in');
                }
                
this.over true;
            },
            
_hideTooltip: function() {
                if (
this.inDrag === false && this.alwaysShowTooltip !== true) {
                    
this._removeClass(this.tooltip'in');
                    
this._removeClass(this.tooltip_min'in');
                    
this._removeClass(this.tooltip_max'in');
                }
                
this.over false;
            },
                
_layout: function() {            
                var 
positionPercentages;

                if(
this.options.reversed) {
                    
positionPercentages = [ 100 this.percentage[0], this.percentage[1] ];
                } else {
                    
positionPercentages = [ this.percentage[0], this.percentage[1] ];
                }

                
this.handle1.style[this.stylePos] = positionPercentages[0]+'%';
                
this.handle2.style[this.stylePos] = positionPercentages[1]+'%';

                if (
this.options.orientation === 'vertical') {
                    
this.trackSelection.style.top Math.min(positionPercentages[0], positionPercentages[1]) +'%';
                    
this.trackSelection.style.height Math.abs(positionPercentages[0] - positionPercentages[1]) +'%';
                } else {
                    
this.trackSelection.style.left Math.min(positionPercentages[0], positionPercentages[1]) +'%';
                    
this.trackSelection.style.width Math.abs(positionPercentages[0] - positionPercentages[1]) +'%';

                    var 
offset_min this.tooltip_min.getBoundingClientRect();
                    var 
offset_max this.tooltip_max.getBoundingClientRect();

                    if (
offset_min.right offset_max.left) {
                        
this._removeClass(this.tooltip_max'top');
                        
this._addClass(this.tooltip_max'bottom');
                        
this.tooltip_max.style.top 18 'px';
                    } else {
                        
this._removeClass(this.tooltip_max'bottom');
                        
this._addClass(this.tooltip_max'top');
                        
this.tooltip_max.style.top = -30 'px';
                    }
                 }


                 var 
formattedTooltipVal;

                if (
this.options.range) {
                    
formattedTooltipVal this.options.formatter(this.options.value);
                    
this._setText(this.tooltipInnerformattedTooltipVal);
                    
this.tooltip.style[this.stylePos] = (positionPercentages[1] + positionPercentages[0])/'%';

                    if (
this.options.orientation === 'vertical') {
                        
this._css(this.tooltip'margin-top', -this.tooltip.offsetHeight 'px');
                    } else {
                        
this._css(this.tooltip'margin-left', -this.tooltip.offsetWidth 'px');
                    }
                    
                    if (
this.options.orientation === 'vertical') {
                        
this._css(this.tooltip'margin-top', -this.tooltip.offsetHeight 'px');
                    } else {
                        
this._css(this.tooltip'margin-left', -this.tooltip.offsetWidth 'px');
                    }
                    
                    var 
innerTooltipMinText this.options.formatter(this.options.value[0]);
                    
this._setText(this.tooltipInner_mininnerTooltipMinText);

                    var 
innerTooltipMaxText this.options.formatter(this.options.value[1]);
                    
this._setText(this.tooltipInner_maxinnerTooltipMaxText);

                    
this.tooltip_min.style[this.stylePos] = positionPercentages[0] + '%';

                    if (
this.options.orientation === 'vertical') {
                        
this._css(this.tooltip_min'margin-top', -this.tooltip_min.offsetHeight 'px');
                    } else {
                        
this._css(this.tooltip_min'margin-left', -this.tooltip_min.offsetWidth 'px');
                    }

                    
this.tooltip_max.style[this.stylePos] = positionPercentages[1] + '%';

                    if (
this.options.orientation === 'vertical') {
                        
this._css(this.tooltip_max'margin-top', -this.tooltip_max.offsetHeight 'px');
                    } else {
                        
this._css(this.tooltip_max'margin-left', -this.tooltip_max.offsetWidth 'px');
                    }
                } else {
                    
formattedTooltipVal this.options.formatter(this.options.value[0]);
                    
this._setText(this.tooltipInnerformattedTooltipVal);

                    
this.tooltip.style[this.stylePos] = positionPercentages[0] + '%';
                    if (
this.options.orientation === 'vertical') {
                        
this._css(this.tooltip'margin-top', -this.tooltip.offsetHeight 'px');
                    } else {
                        
this._css(this.tooltip'margin-left', -this.tooltip.offsetWidth 'px');
                    }
                }
            },
            
_removeProperty: function(elementprop) {
                if (
element.style.removeProperty) {
                    
element.style.removeProperty(prop);
                } else {
                    
element.style.removeAttribute(prop);
                }
            },
            
_mousedown: function(ev) {
                if(!
this.options.enabled) {
                    return 
false;
                }

                
this._triggerFocusOnHandle();

                
this.offset this._offset(this.sliderElem);
                
this.size this.sliderElem[this.sizePos];

                var 
percentage this._getPercentage(ev);

                if (
this.options.range) {
                    var 
diff1 Math.abs(this.percentage[0] - percentage);
                    var 
diff2 Math.abs(this.percentage[1] - percentage);
                    
this.dragged = (diff1 diff2) ? 1;
                } else {
                    
this.dragged 0;
                }

                
this.percentage[this.dragged] = this.options.reversed 100 percentage percentage;
                
this._layout();

                
this.mousemove this._mousemove.bind(this);
                
this.mouseup this._mouseup.bind(this);

                if (
this.touchCapable) {
                    
// Touch: Bind touch events:
                    
document.addEventListener("touchmove"this.mousemovefalse);
                    
document.addEventListener("touchend"this.mouseupfalse);
                } else {
                    
// Bind mouse events:
                    
document.addEventListener("mousemove"this.mousemovefalse);
                    
document.addEventListener("mouseup"this.mouseupfalse);
                }

                
this.inDrag true;

                var 
val this._calculateValue();
                
this._trigger('slideStart'val);
                
this._setDataVal(val);
                
this.setValue(val);

                
this._pauseEvent(ev);

                return 
true;
            },
            
_triggerFocusOnHandle: function(handleIdx) {
                if(
handleIdx === 0) {
                    
this.handle1.focus();
                }
                if(
handleIdx === 1) {
                    
this.handle2.focus();
                }
            },
            
_keydown: function(handleIdxev) {
                if(!
this.options.enabled) {
                    return 
false;
                }

                var 
dir;
                switch (
ev.keyCode) {
                    case 
37// left
                    
case 40// down
                        
dir = -1;
                        break;
                    case 
39// right
                    
case 38// up
                        
dir 1;
                        break;
                }
                if (!
dir) {
                    return;
                }

                
// use natural arrow keys instead of from min to max
                
if (this.options.natural_arrow_keys) {
                    var 
ifVerticalAndNotReversed = (this.options.orientation === 'vertical' && !this.options.reversed);
                    var 
ifHorizontalAndReversed = (this.options.orientation === 'horizontal' && this.options.reversed);

                    if (
ifVerticalAndNotReversed || ifHorizontalAndReversed) {
                        
dir dir * -1;
                    }
                }

                var 
oneStepValuePercentageChange dir this.percentage[2];
                var 
percentage this.percentage[handleIdx] + oneStepValuePercentageChange;

                if (
percentage 100) {
                    
percentage 100;
                } else if (
percentage 0) {
                    
percentage 0;
                }

                
this.dragged handleIdx;
                
this._adjustPercentageForRangeSliders(percentage);
                
this.percentage[this.dragged] = percentage;
                
this._layout();

                var 
val this._calculateValue();
                
                
this._trigger('slideStart'val);
                
this._setDataVal(val);
                
this.setValue(valtrue);

                
this._trigger('slideStop'val);
                
this._setDataVal(val);
                
                
this._pauseEvent(ev);

                return 
false;
            },
            
_pauseEvent: function(ev) {
                if(
ev.stopPropagation) {
                    
ev.stopPropagation();
                }
                if(
ev.preventDefault) {
                    
ev.preventDefault();
                }
                
ev.cancelBubble=true;
                
ev.returnValue=false;            
            },
            
_mousemove: function(ev) {
                if(!
this.options.enabled) {
                    return 
false;
                }

                var 
percentage this._getPercentage(ev);
                
this._adjustPercentageForRangeSliders(percentage);
                
this.percentage[this.dragged] = this.options.reversed 100 percentage percentage;
                
this._layout();

                var 
val this._calculateValue();
                
this.setValue(valtrue);

                return 
false;
            },
            
_adjustPercentageForRangeSliders: function(percentage) {
                if (
this.options.range) {
                    if (
this.dragged === && this.percentage[1] < percentage) {
                        
this.percentage[0] = this.percentage[1];
                        
this.dragged 1;
                    } else if (
this.dragged === && this.percentage[0] > percentage) {
                        
this.percentage[1] = this.percentage[0];
                        
this.dragged 0;
                    }
                }
            },
            
_mouseup: function() {
                if(!
this.options.enabled) {
                    return 
false;
                }
                if (
this.touchCapable) {
                    
// Touch: Unbind touch event handlers:
                    
document.removeEventListener("touchmove"this.mousemovefalse);
                    
document.removeEventListener("touchend"this.mouseupfalse);
                } else {
                    
// Unbind mouse event handlers:
                    
document.removeEventListener("mousemove"this.mousemovefalse);
                    
document.removeEventListener("mouseup"this.mouseupfalse);
                }
                
                
this.inDrag false;
                if (
this.over === false) {
                    
this._hideTooltip();
                }
                var 
val this._calculateValue();
                
                
this._layout();
                
this._setDataVal(val);
                
this._trigger('slideStop'val);
                
                return 
false;
            },
            
_calculateValue: function() {
                var 
val;
                if (
this.options.range) {
                    
val = [this.options.min,this.options.max];
                    if (
this.percentage[0] !== 0){
                        
val[0] = (Math.max(this.options.minthis.options.min Math.round((this.diff this.percentage[0]/100)/this.options.step)*this.options.step));
                        
val[0] = this._applyPrecision(val[0]);
                    }
                    if (
this.percentage[1] !== 100){
                        
val[1] = (Math.min(this.options.maxthis.options.min Math.round((this.diff this.percentage[1]/100)/this.options.step)*this.options.step));
                        
val[1] = this._applyPrecision(val[1]);
                    }
                    
this.options.value val;
                } else {
                    
val = (this.options.min Math.round((this.diff this.percentage[0]/100)/this.options.step)*this.options.step);
                    if (
val this.options.min) {
                        
val this.options.min;
                    }
                    else if (
val this.options.max) {
                        
val this.options.max;
                    }
                    
val parseFloat(val);
                    
val this._applyPrecision(val);
                    
this.options.value = [valthis.options.value[1]];
                }
                return 
val;
            },
            
_applyPrecision: function(val) {
                var 
precision this.options.precision || this._getNumDigitsAfterDecimalPlace(this.step);
                return 
this._applyToFixedAndParseFloat(valprecision);
            },
            
_getNumDigitsAfterDecimalPlace: function(num) {
                var 
match = (''+num).match(/(?:.(d+))?(?:[eE]([+-]?d+))?$/);
                if (!
match) { return 0; }
                return 
Math.max(0, (match[1] ? match[1].length 0) - (match[2] ? +match[2] : 0));
            },
            
_applyToFixedAndParseFloat: function(numtoFixedInput) {
                var 
truncatedNum num.toFixed(toFixedInput);
                return 
parseFloat(truncatedNum);
            },
            
/*
                Credits to Mike Samuel for the following method!
                Source: http://stackoverflow.com/questions/10454518/javascript-how-to-retrieve-the-number-of-decimals-of-a-string-number
            */
            
_getPercentage: function(ev) {
                if (
this.touchCapable && (ev.type === 'touchstart' || ev.type === 'touchmove')) {
                    
ev ev.touches[0];
                }
                var 
percentage = (ev[this.mousePos] - this.offset[this.stylePos])*100/this.size;
                
percentage Math.round(percentage/this.percentage[2])*this.percentage[2];
                return 
Math.max(0Math.min(100percentage));
            },
            
_validateInputValue: function(val) {
                if(
typeof val === 'number') {
                    return 
val;
                } else if(
val instanceof Array) {
                    
this._validateArray(val);
                    return 
val;
                } else {
                    throw new 
ErrorErrorMsgs.formatInvalidInputErrorMsg(val) );
                }
            },
            
_validateArray: function(val) {
                for(var 
0val.lengthi++) {
                    var 
input =  val[i];
                    if (
typeof input !== 'number') { throw new ErrorErrorMsgs.formatInvalidInputErrorMsg(input) ); }
                }
            },
            
_setDataVal: function(val) {
                var 
value "value: '" val "'";
                
this.element.setAttribute('data'value);
                
this.element.setAttribute('value'val);
            },
            
_trigger: function(evtval) {
                
val val || undefined;

                var 
callbackFnArray this.eventToCallbackMap[evt];
                if(
callbackFnArray && callbackFnArray.length) {
                    for(var 
0callbackFnArray.lengthi++) {
                        var 
callbackFn callbackFnArray[i];
                        
callbackFn(val);
                    }
                }

                
/* If JQuery exists, trigger JQuery events */
                
if($) {
                    
this._triggerJQueryEvent(evtval);
                }
            },
            
_triggerJQueryEvent: function(evtval) {
                var 
eventData = {
                    
typeevt,
                    
valueval
                
};
                
this.$element.trigger(eventData);
                
this.$sliderElem.trigger(eventData);
            },
            
_unbindJQueryEventHandlers: function() {
                
this.$element.off();
                
this.$sliderElem.off();
            },
            
_setText: function(elementtext) {
                if(
typeof element.innerText !== "undefined") {
                     
element.innerText text;
                 } else if(
typeof element.textContent !== "undefined") {
                     
element.textContent text;
                 }
            },
            
_removeClass: function(elementclassString) {
                var 
classes classString.split(" ");
                var 
newClasses element.className;

                for(var 
0classes.lengthi++) {
                    var 
classTag classes[i];
                    var 
regex = new RegExp("(?:\s|^)" classTag "(?:\s|$)");
                    
newClasses newClasses.replace(regex" ");
                }

                
element.className newClasses.trim();
            },
            
_addClass: function(elementclassString) {
                var 
classes classString.split(" ");
                var 
newClasses element.className;

                for(var 
0classes.lengthi++) {
                    var 
classTag classes[i];
                    var 
regex = new RegExp("(?:\s|^)" classTag "(?:\s|$)");
                    var 
ifClassExists regex.test(newClasses);
                    
                    if(!
ifClassExists) {
                        
newClasses += " " classTag;
                    }
                }

                
element.className newClasses.trim();
            },
            
_offset: function (obj) {
                var 
ol 0;
                var 
ot 0;
                if (
obj.offsetParent) {
                    do {
                      
ol += obj.offsetLeft;
                      
ot += obj.offsetTop;
                    } while (
obj obj.offsetParent);
                }
                return {
                    
leftol,
                    
topot
                
};
            },
            
_css: function(elementRefstyleNamevalue) {
                
elementRef.style[styleName] = value;
            }
        };

        
/*********************************

            Attach to global namespace

        *********************************/
        
if($) {
            var namespace = $.
fn.slider 'bootstrapSlider' 'slider';
            $.
bridget(namespace, Slider);
        } else {
            
window.Slider Slider;
        }


    })( $ );

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