var ANY_LABEL = 'any';
var checkexact = function(ops) { return function(e,ui) { 
    ops.removeAttr('checked').eq(ui.value).attr('checked','checked'); 
    }};
var checkall = function(ops) { return function(e,ui) { 
    ops.removeAttr('checked');
    if (ui.value == 0) { ops.eq(0).attr('checked','checked'); } 
    else { ops.slice(ui.value).attr('checked','checked'); }
    }};
var onslide_fun = function(ops,labels,convert, anytext) { return function(event, ui) {
    for (var i=-1; ++i<2;) { 
        var val = convert(ui.values[i]);
        ops[i].val(val);
        labels[i].text(val||anytext);
        }
    }};
var extra_sliders = new Array();
          
// build sliders:
var enable_options = function(container) {
    container.find('[class$=range]').each(function(){
        var td = $(this);
        var options = td.find('input');
        options = [options.eq(0), options.eq(1)];
        var labels = td.find('.ui-slider-handle span');
        labels = [labels.eq(0), labels.eq(1)];

        /* translate ranges */
        var ranges = eval('('+td.find('.ranges').val()+')'), slider=td.find('.fluentSlider');
        var ranges_len = ranges.length, offmax=slider.width();
        var range_size = offmax/ranges_len;
        var min_val=ranges[0][0], max_val=ranges[ranges_len-1][1];
        
        var real2off = function(v) { 
            // find the right range
            var range = 0;
            while (v>ranges[range][1]) { range++; }
            var m = ranges[range][0], x = ranges[range][1];
            return Math.round( (range + ((v-m)/(x-m)) )*range_size )
            }

        var off2real = function(v) { 
            if (v == 0 || v==offmax) return '';
            var range = Math.floor(v / range_size);
            var inrange = v / range_size - range;
            if (range==ranges_len) { inrange=1; range-=1; }
            var m = ranges[range][0], x = ranges[range][1];
            return Math.round( inrange*(x-m) + m);
            }
        var from = real2off((function(v){return (v<min_val||isNaN(v))?min_val:v})(parseInt(options[0].val())));
        var to = real2off((function(v){return (v>max_val||isNaN(v))?max_val:v})(parseInt(options[1].val())));
        var onslide = onslide_fun(options,labels, off2real, ANY_LABEL);
        slider.slider({ 
            range: true,
            min: 0,
            max: offmax,
            step:1,
            values: [from, to],
            slide: onslide
            });
        onslide(null, {values:[from, to]})
        
    });

    // selects
    container.find('[class$=select]').each(function(){
        var td = $(this);
        var options = td.find('input');
        var checkmore = (options.eq(0).val()!=""); // use selects as "or more" - simulate all for all checked
        if (checkmore) options.eq(0).val(""); // first option simulates all
        var onslide = (checkmore)? checkall(options) : checkexact(options);
        var value = options.index(options.filter('[checked]'));
        if (value==-1) value=0;
        var slider =  td.find('.stepSlider').slider({ 
            //value:100, take the selected option 
            min: 0,
            max: options.length-1,
            step: 1,
            value: value,
            slide: onslide
        });
        onslide(null,{
            value:value
        });
    });
 };
 

