browsejs/browse.js

View on GitHub
lib/controls.js

Summary

Maintainability
A
0 mins
Test Coverage
/** global: browse */

browse.prototype.value = function(value) {
  if(undefined === value) {
    return _getControlValue(this.element)
  }
  _setControlValue(this.element, value)
  return this
}

function _getControlValue(element) {
  if('value' in element) {
    var def
    if(!element.value && (def = _handleFalsyControlValue(element))) {
      return def
    }
    return element.value
  }
  throw new TypeError('Element does not support entering or selecting a value')
}

function _setControlValue(element, value) {
  if('value' in element) {
    element.value = value
    var tagName = element.tagName.toLowerCase()
    if('select' === tagName) {
      _setSelectValue(element, value)
    }
    else if('textarea' === tagName) {
      element.innerHTML = value
    }
    return
  }
  throw new TypeError('Element does not support entering or selecting a value')
}

var _onTypes = ['radio', 'checkbox']

function _handleFalsyControlValue(element) {
  var tagName = element.tagName.toLowerCase()
  if('option' === tagName) {
    return element.innerHTML
  }
  if('input' === tagName && -1 !== _onTypes.indexOf(element.type)) {
    return 'on'
  }
  return undefined
}

function _setSelectValue(element, value) {
  var options = element.getElementsByTagName('option'), idx
  for(idx = 0; idx < options.length; ++idx) {
    var option = options[idx]
    if(value === option.value) {
      option.setAttribute('selected', '')
    }
    else {
      option.removeAttribute('selected')
    }
  }
}