/**
 * Ползунок с объёмом
 *
 * @property jQuery nodeSlider
 *           нода ползунка
 * @property jQuery nodeVolume
 *           нода отображения объёма
 * @property [min,max] limits
 *           шкала
 * @property int sliderValue
 *           значение на слайдере (0-1000)
 * @property function[] listeners
 *           список слушателей прокрутки
 * @property int value
 *           текущая позиция на шкале
 * @property float volume
 *           текущий выбранный объём
 */
CalcClass.SliderClass = go.Class({

    /**
     * Шкала ползунка для различных контейнеров.
     * Объём контейнера => [min, max]
     */
    'CONTAINERS_LIMITS': {
        '0.8' : [0.8, 1000],
        '1.1' : [1.1, 1375],
        '8'   : [8, 2000],
        '20'  : [20, 3000],
        '27'  : [27, 3510],
        '33'  : [33, 4290]
    },
    
    'SCALE': 1000,
    
    'SCALE2': null,

    /**
     * Конструктор
     *
     * @param jQuery nodeSlider
     * @param jQuery nodeVolume
     */
    '__construct': (function(nodeSlider, nodeVolume) {
        this.SCALE2 = this.SCALE * this.SCALE;
        this.nodeSlider = $(nodeSlider);
        this.nodeVolume = $(nodeVolume);
        this.limits = {
            'min'   : this.CONTAINERS_LIMITS['0.8'][0],
            'max'   : this.CONTAINERS_LIMITS['0.8'][1],            
            'delta' : this.CONTAINERS_LIMITS['0.8'][1] - this.CONTAINERS_LIMITS['0.8'][0],
        };
        this.value  = 0;
        this.volume = this.limits.min;
        this.initSlider();
        this.listeners = [];
    }),
    
    /**
     * Установить пределы шкалы
     *
     * @param float min
     * @param float max
     */
    'setLimits': (function(min, max) {
        var limits = this.limits;
        if ((limits.min == min) && (limits.max == max)) {
            return;
        }
        limits.min   = min;
        limits.max   = max;
        limits.delta = max - min;
        this.value = this.volume2value(this.volume);
        this.nodeSlider.slider("option", "value", this.value);        
        var volume = this.volume;
        if ((volume < limits.min) || (volume > limits.max)) {
            volume = null;
        }
        this.draw(volume);
    }),
    
    /**
     * Указать объём контейнера (по нему определяются пределы)
     *
     * @param float container
     */
    'setContainer': (function(container) {
        var limits = this.CONTAINERS_LIMITS[container];
        this.setLimits(limits[0], limits[1]);
    }),
    
    /**
     * Инициализация слайдера
     */
    'initSlider': (function() {
        this.nodeSlider.slider({
            'animate' : "fast",
            'range'   : false,
            'min'     : 0,
            'max'     : this.SCALE,
            'orientation': "horizontal",
            'step'    : 1,
            'value'   : 0,
            'slide'   : this.onSlide
        });            
    }),

    /**
     * Отрисовка объёма
     */
    'draw': (function(volume) {
        var volume = volume || this.value2volume(this.value);
        this.volume = volume;
        if (volume < 10) {
            volume = volume.toFixed(1).replace(".", ",");
        } else {
            volume = volume.toFixed(0);
        }
        this.nodeVolume.text(volume);
        this.runListeners();
    }),
    
    'value2volume': (function(value) {        
        var limits = this.limits;
        var value2 = value * value;
        var f      = (value2 / this.SCALE2) * limits.delta;
        var volume = f + limits.min;
        return volume;
    }),
    
    'volume2value': (function(volume) {
        var limits = this.limits;
        value = Math.round(Math.sqrt(((volume - limits.min) * this.SCALE2) / limits.delta));
        if (isNaN(value)) {
            return 0;
        } else if (value < 0) {
            return 0;
        } else if (value > this.SCALE) {
            return this.SCALE;
        }
        return value;
    }),
    
    'addEventListener': (function(listener) {
        this.listeners.push(listener);
    }),
    
    'runListeners': (function() {
        var listeners = this.listeners;
        var len       = listeners.length;
        var volume    = this.volume;
        for (var i = 0; i < len; i++) {
            listeners[i](volume);
        }
    }),    
    
    /**
     * Обработка таскания ползунка
     */
    'onSlide_bind': (function(e, value) {
        this.value = value.value;
        this.draw();
    }),

    'eoc': null
});

