/**
 * @fileOverview Oprava pro interakci Selectable knihovny jQuery UI. Tento
 * skript zajišťuje, že uživatel nebude moct vybrat posuvník v seznamu
 * s pevnou výškou a hodnotou auto u vlastnosti overflow, pokud je obsah delší
 * než nastavená výška.
 * Tato chyba se stále nachází ve verzi 1.8.18 knihovny jQuery UI. Podle
 * záznamu na adrese http://bugs.jqueryui.com/ticket/4441 by ale měla být
 * v některé budoucí verzi této knihovny opravena.
 * @author Ondřej Baše, Brandon Aaron
 */

(function($) {

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

/*! Copyright (c) 2008 Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*/

/**
 * Šířka posuvníku.
 * @type Number
 */
var scrollbarWidth = 0;

/**
 * Zjišťuje šířku posuvníku. Jedná se o metodu objektu jQuery.
 * @returns {Number} Šířka posuvníku v pixelech.
 */
$.getScrollbarWidth = function() {
  if (!scrollbarWidth) {
    if ($.browser.msie) {
      var $textarea1 = $('<textarea cols="10" rows="2"></textarea>')
          .css({position: 'absolute', top: -1000, left: -1000}).appendTo('body'),
        $textarea2 = $('<textarea cols="10" rows="2" style="overflow: hidden;"></textarea>')
          .css({position: 'absolute', top: -1000, left: -1000}).appendTo('body');
      scrollbarWidth = $textarea1.width() - $textarea2.width();
      $textarea1.add($textarea2).remove();
    } else {
      var $div = $('<div />')
        .css({ width: 100, height: 100, overflow: 'auto', position: 'absolute', top: -1000, left: -1000 })
        .prependTo('body').append('<div />').find('div')
        .css({ width: '100%', height: 200 });
       scrollbarWidth = 100 - $div.width();
       $div.parent().remove();
    }
  }
  return scrollbarWidth;
};

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

/**
 * Opravuje instanci interakce Selectable. Jedná se o metodu objektu knihovny
 * jQuery.
 */
$.fn.selectableFix = function() {
  var $element = $(this),
   mdHandler = $.grep($element.data('events').mousedown, function(ev) {
      return ev.namespace == 'selectable';
    })[0].handler;

  $element
    .unbind('mousedown', mdHandler)
    .mousedown(function(ev) {
      if (ev.pageX <= $element.offset().left + $element.width() -
          $.getScrollbarWidth()) {
        mdHandler.apply(this, arguments);
      }
    });
}

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

/* Následující kód zajišťuje, že se metoda selectableFix() zavolá hned po
 * inicializaci interakce Selectable. Vzhledem k tomu, že obaluje původní
 * metodu selectable() do nové, ulehčuje sice práci, ale poněkud zpomaluje
 * zpracování. Kdyby byla nutná optimalizace, následující kód bychom měli
 * odstranit a volat metodu selectableFix() ručně.
 */

/**
 * Původní metoda interakce Selectable.
 * @type {function}
 */
var oldSelectable = $.fn.selectable;

/**
 * Nová metoda selectable(), která volá původní metodu a pokud právě
 * inicializujeme interakci Selectable, tak zavolá také metodu
 * selectableFix().
 */
$.fn.selectable = function() {
  oldSelectable.apply(this, arguments);
  if (!arguments.length || typeof arguments[0] == 'object') {
    this.selectableFix();
  }
}

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

})(jQuery);