rivets.js 3.94 KB
// Generated by CoffeeScript 1.3.1
(function() {
  var __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };

  window.rivets = (function() {
    var attributeBinding, bidirectionalBindings, bindings, getInputValue, registerBinding, setAttribute;
    registerBinding = function(el, adapter, type, context, keypath) {
      var bind;
      bind = bindings[type] || attributeBinding(type);
      bind(el, adapter.read(context, keypath));
      adapter.subscribe(context, keypath, function(value) {
        return bind(el, value);
      });
      if (__indexOf.call(bidirectionalBindings, type) >= 0) {
        return el.addEventListener('change', function() {
          return adapter.publish(context, keypath, getInputValue(this));
        });
      }
    };
    setAttribute = function(el, attr, value, mirrored) {
      if (mirrored == null) {
        mirrored = false;
      }
      if (value) {
        return el.setAttribute(attr, mirrored ? attr : value);
      } else {
        return el.removeAttribute(attr);
      }
    };
    getInputValue = function(el) {
      switch (el.type) {
        case 'text':
        case 'textarea':
        case 'password':
        case 'select-one':
          return el.value;
        case 'checkbox':
          return el.checked;
      }
    };
    bindings = {
      show: function(el, value) {
        return el.style.display = value ? '' : 'none';
      },
      hide: function(el, value) {
        return el.style.display = value ? 'none' : '';
      },
      enabled: function(el, value) {
        return setAttribute(el, 'disabled', !value, true);
      },
      disabled: function(el, value) {
        return setAttribute(el, 'disabled', value, true);
      },
      checked: function(el, value) {
        return setAttribute(el, 'checked', value, true);
      },
      unchecked: function(el, value) {
        return setAttribute(el, 'checked', !value, true);
      },
      selected: function(el, value) {
        return setAttribute(el, 'selected', value, true);
      },
      unselected: function(el, value) {
        return setAttribute(el, 'checked', !value, true);
      },
      text: function(el, value) {
        return el.innerHTML = value || '';
      },
      value: function(el, value) {
        return el.value = value;
      }
    };
    attributeBinding = function(attr) {
      return function(el, value) {
        return setAttribute(el, attr, value);
      };
    };
    bidirectionalBindings = ['value', 'checked', 'unchecked', 'selected', 'unselected'];
    return {
      bind: function(el, adapter, contexts) {
        var nodes, _i, _ref, _results;
        if (contexts == null) {
          contexts = {};
        }
        nodes = el.getElementsByTagName('*');
        return (function() {
          _results = [];
          for (var _i = 0, _ref = nodes.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }
          return _results;
        }).apply(this).forEach(function(n) {
          var node, _i, _ref, _results;
          node = nodes[n];
          if (node.attributes.length > 0) {
            return (function() {
              _results = [];
              for (var _i = 0, _ref = node.attributes.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }
              return _results;
            }).apply(this).forEach(function(n) {
              var attribute, context, keypath, path, type;
              attribute = node.attributes[n];
              if (/^data-/.test(attribute.name)) {
                type = attribute.name.replace('data-', '');
                path = attribute.value.split('.');
                context = path.shift();
                keypath = path.join('.');
                return registerBinding(node, adapter, type, contexts[context], keypath);
              }
            });
          }
        });
      }
    };
  })();

}).call(this);