text: import { hasAttributeNS } from './util';
  
  function syncBooleanAttrProp(fromEl, toEl, name) {
      if (fromEl[name] !== toEl[name]) {
          fromEl[name] = toEl[name];
          if (fromEl[name]) {
              fromEl.setAttribute(name, '');
          } else {
              fromEl.removeAttribute(name, '');
          }
      }
  }
  
  export default {
      /**
       * Needed for IE. Apparently IE doesn't think that "selected" is an
       * attribute when reading over the attributes using selectEl.attributes
       */
      OPTION: function(fromEl, toEl) {
          syncBooleanAttrProp(fromEl, toEl, 'selected');
      },
      /**
       * The "value" attribute is special for the <input> element since it sets
       * the initial value. Changing the "value" attribute without changing the
       * "value" property will have no effect since it is only used to the set the
       * initial value.  Similar for the "checked" attribute, and "disabled".
       */
      INPUT: function(fromEl, toEl) {
          syncBooleanAttrProp(fromEl, toEl, 'checked');
          syncBooleanAttrProp(fromEl, toEl, 'disabled');
  
          if (fromEl.value !== toEl.value) {
              fromEl.value = toEl.value;
          }
  
          if (!hasAttributeNS(toEl, null, 'value')) {
              fromEl.removeAttribute('value');
          }
      },
  
      TEXTAREA: function(fromEl, toEl) {
          var newValue = toEl.value;
          if (fromEl.value !== newValue) {
              fromEl.value = newValue;
          }
  
          if (fromEl.firstChild) {
              // Needed for IE. Apparently IE sets the placeholder as the
              // node value and vise versa. This ignores an empty update.
              if (newValue === '' && fromEl.firstChild.nodeValue === fromEl.placeholder) {
                  return;
              }
  
              fromEl.firstChild.nodeValue = newValue;
          }
      },
      SELECT: function(fromEl, toEl) {
          if (!hasAttributeNS(toEl, null, 'multiple')) {
              var selectedIndex = -1;
              var i = 0;
              var curChild = toEl.firstChild;
              while(curChild) {
                  var nodeName = curChild.nodeName;
                  if (nodeName && nodeName.toUpperCase() === 'OPTION') {
                      if (hasAttributeNS(curChild, null, 'selected')) {
                          selectedIndex = i;
                          break;
                      }
                      i++;
                  }
                  curChild = curChild.nextSibling;
              }
  
              fromEl.selectedIndex = i;
          }
      }
  };