jquery-ui-sliderAccess.js

100 lines | 3.289 kB Blame History Raw Download
/*
 * jQuery UI Slider Access
 * By: Trent Richardson [http://trentrichardson.com]
 * Version 0.3
 * Last Modified: 10/20/2012
 *
 * Copyright 2011 Trent Richardson
 * Dual licensed under the MIT and GPL licenses.
 * http://trentrichardson.com/Impromptu/GPL-LICENSE.txt
 * http://trentrichardson.com/Impromptu/MIT-LICENSE.txt
 *
 */
(function ($) {

  $.fn.extend({
    sliderAccess: function (options) {
      options = options || {};
      options.touchonly = options.touchonly !== undefined ? options.touchonly
          : true; // by default only show it if touch device

      if (options.touchonly === true && !("ontouchend" in document)) {
        return $(this);
      }

      return $(this).each(function (i, obj) {
        var $t = $(this),
            o = $.extend({}, {
              where: 'after',
              step: $t.slider('option', 'step'),
              upIcon: 'ui-icon-plus',
              downIcon: 'ui-icon-minus',
              text: false,
              upText: '+',
              downText: '-',
              buttonset: true,
              buttonsetTag: 'span',
              isRTL: false
            }, options),
            $buttons = $('<' + o.buttonsetTag + ' class="ui-slider-access">' +
                '<button data-icon="' + o.downIcon + '" data-step="' + (o.isRTL
                    ? o.step : o.step * -1) + '">' + o.downText + '</button>' +
                '<button data-icon="' + o.upIcon + '" data-step="' + (o.isRTL
                    ? o.step * -1 : o.step) + '">' + o.upText + '</button>' +
                '</' + o.buttonsetTag + '>');

        $buttons.children('button').each(function (j, jobj) {
          var $jt = $(this);
          $jt.button({
            text: o.text,
            icons: {primary: $jt.data('icon')}
          })
          .click(function (e) {
            var step = $jt.data('step'),
                curr = $t.slider('value'),
                newval = curr += step * 1,
                minval = $t.slider('option', 'min'),
                maxval = $t.slider('option', 'max'),
                slidee = $t.slider("option", "slide") || function () {
                },
                stope = $t.slider("option", "stop") || function () {
                };

            e.preventDefault();

            if (newval < minval || newval > maxval) {
              return;
            }

            $t.slider('value', newval);

            slidee.call($t, null, {value: newval});
            stope.call($t, null, {value: newval});
          });
        });

        // before or after
        $t[o.where]($buttons);

        if (o.buttonset) {
          $buttons.removeClass('ui-corner-right').removeClass(
              'ui-corner-left').buttonset();
          $buttons.eq(0).addClass('ui-corner-left');
          $buttons.eq(1).addClass('ui-corner-right');
        }

        // adjust the width so we don't break the original layout
        var bOuterWidth = $buttons.css({
          marginLeft: ((o.where == 'after' && !o.isRTL) || (o.where == 'before'
              && o.isRTL) ? 10 : 0),
          marginRight: ((o.where == 'before' && !o.isRTL) || (o.where == 'after'
              && o.isRTL) ? 10 : 0)
        }).outerWidth(true) + 5;
        var tOuterWidth = $t.outerWidth(true);
        $t.css('display', 'inline-block').width(tOuterWidth - bOuterWidth);
      });
    }
  });

})(jQuery);