if (!reservation_miscutility_js_included) { var reservation_miscutility_js_included = true;

// String helper functions

function trim(str) {
  if (typeof(str) != 'string') return str;
  return str.replace(/^\s+|\s+$/g, '');
}

function contains(outerString, innerString) {
  return (outerString.indexOf(innerString) != -1);
}

// DOM helpers
function getActiveRadioValue(name) {
  var radios = document.getElementsByName(name);
  for (var i = 0; i < radios.length; ++i) {
    if (radios[i].checked) return radios[i].value;
  }

  return null;
}

// Browser/event support

function execOnLoad(func) {
  var prevOnload = window.onload;
  window.onload = function() {
    if (prevOnload) prevOnload();
    func();
  }
}

function getEventCharCode(ev) {
  if (ev.keyCode) {
    return ev.keyCode;
	} else {
    return ev.which;
  }
}

function getEventChar(ev) {
  return String.fromCharCode(getEventCharCode(ev));
}

function filterNumericInput(ev)
{
  var code = getEventCharCode(ev);

  if ((code == 44) || (code == 46)) return true; // '.'/Delete and ','
  if ((code >= 48) && (code <= 57)) return true; // digits
  if ((code == 9) || (code == 8) // tab and backspace
          || ((code >= 37) && (code <= 40)) || (code == 35) || (code == 36) // arrows and home/end (FF)
          || (code == 0)) { // a non-character key (IE).
    return true;
  }

  if (ev.preventDefault) {
    ev.preventDefault();
  } else {
    ev.returnValue = false;
  }
  return false;
}

// Layout helpers

// Requires jquery
function deferredDisable(controlSelector)
{
  var $control = $(controlSelector);
  if ($control.size()) window.setTimeout(function() { $control.attr('disabled', 'disabled'); });

  return true;
}

// Requires jquery
function showBlockAboveButton(blockSelector, buttonSelector, alignment, distance)
{
  if (distance == undefined) { distance = 6; }
  if (alignment != 'left' && alignment != 'center' && alignment != 'right') { alignment = 'center'; }

  var $block = $(blockSelector);
  var $button = $(buttonSelector);
  if (!$block.size() || !$button.size()) return;

  $block.css('display', '');
  $block.css('margin-left', '0');
  $block.css('margin-top', '0');

  var blockPosition = $block.offset();
  var buttonPosition = $button.offset();

  var horizontalOffset;
  switch (alignment)
  {
    case 'left':
      horizontalOffset = buttonPosition.left - blockPosition.left;
      break
    case 'center':
      horizontalOffset = buttonPosition.left - blockPosition.left
                         + ($button.innerWidth() - $block.innerWidth()) / 2;
      break;
    case 'right':
      horizontalOffset = (buttonPosition.left + $button.innerWidth())
                         - (blockPosition.left + $block.innerWidth());
      break;
  }

  var verticalOffset = buttonPosition.top - blockPosition.top - $block.innerHeight() - distance;

  $block.css('margin-left', horizontalOffset + 'px');
  $block.css('margin-top', verticalOffset + 'px');
}

// Requires jquery
function showBlockNextToButton(blockSelector, buttonSelector, alignment, distance)
{
  if (distance == undefined) { distance = 6; }
  if (alignment != 'top' && alignment != 'middle' && alignment != 'bottom') { alignment = 'middle'; }

  var $block = $(blockSelector);
  var $button = $(buttonSelector);
  if (!$block.size() || !$button.size()) return;

  $block.css('display', '');
  $block.css('margin-left', '0');
  $block.css('margin-top', '0');

  var blockPosition = $block.offset();
  var buttonPosition = $button.offset();

  var verticalOffset;
  switch (alignment)
  {
    case 'top':
      verticalOffset = buttonPosition.top - blockPosition.top;
      break
    case 'middle':
      verticalOffset = buttonPosition.top - blockPosition.top
                       + ($button.innerHeight() - $block.innerHeight()) / 2;
      break;
    case 'bottom':
      verticalOffset = (buttonPosition.top + $button.innerHeight())
                       - (blockPosition.top + $block.innerHeight());
      break;
  }

  var horizontalOffset = buttonPosition.left - blockPosition.left + $button.innerWidth() + distance;

  $block.css('margin-left', horizontalOffset + 'px');
  $block.css('margin-top', verticalOffset + 'px');
}

// Requires jquery
// (Not really used, but Chromium acts funny on reloads if jquery isn't loaded.)
function resizeWindowByElement(element)
{
  // This function assumes that the body margins/paddings are symmetric and
  // that the element is the sole visible contents of body.
  var getAdjustment = function() {
    var screenWidth = (window.innerWidth) ? window.innerWidth : (document.documentElement && document.documentElement.clientWidth) ? document.documentElement.clientWidth : (document.body) ? document.body.clientWidth : 0;
    var screenHeight = (window.innerHeight) ? window.innerHeight : (document.documentElement && document.documentElement.clientHeight) ? document.documentElement.clientHeight : (document.body) ? document.body.clientHeight : 0;
    var paddingAdjustmentWidth = 2 * element.offsetLeft;
    var paddingAdjustmentHeight = 2 * element.offsetTop;

    return {
      x: element.offsetWidth - screenWidth + paddingAdjustmentWidth,
      y: element.offsetHeight - screenHeight + paddingAdjustmentHeight
    };
  };

  window.resizeBy(0, getAdjustment().y); // This gets rid of the vertical scrollbar.
  window.resizeBy(getAdjustment().x, 0); // This finalizes the resizing, already without scrollbar.
}

}

