yahoo/scrollable

View on GitHub
src/prefixed.js

Summary

Maintainability
A
1 hr
Test Coverage
/* Extracted and re-formated from: */
/* Modernizr 2.8.3 (Custom Build) | MIT & BSD
 * Build: http://modernizr.com/download/#-prefixed-testprop-testallprops-domprefixes

   Changes to this code are Copyright 2015 Yahoo Inc. Licensed under the project's
   Open Source license. */
"use strict";

var mod = 'modernizr';
var modElem = typeof document !== "undefined" && document.createElement(mod);
var mStyle = modElem.style;
var omPrefixes = 'Webkit Moz O ms';
var cssomPrefixes = omPrefixes.split(' ');
var domPrefixes = omPrefixes.toLowerCase().split(' ');

function prefixed(prop, obj, elem) {
  if (!obj) {
    return testPropsAll(prop, 'pfx');
  } else {
    return testPropsAll(prop, obj, elem);
  }
}

prefixed.hyphenated = function(prop) {
    // http://modernizr.com/docs/#prefixed
    return prefixed(prop).replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-');
};

function testPropsAll(prop, prefixed, elem) {
  var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1);
  var props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');

  if (is(prefixed, "string") || is(prefixed, "undefined")) {
    return testProps(props, prefixed);
  } else {
    props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');
    return testDOMProps(props, prefixed, elem);
  }
}

function testProps(props, prefixed) {
  for (var i in props) {
    var prop = props[i];
    if (!contains(prop, "-") && mStyle[prop] !== undefined) {
      return prefixed === 'pfx' ? prop : true;
    }
  }
  return false;
}

function testDOMProps(props, obj, elem) {
  for (var i in props) {
    var item = obj[props[i]];
    if (item !== undefined) {

      if (elem === false) {
        return props[i];
      }

      if (is(item, 'function')) {
        return item.bind(elem || obj);
      }

      return item;
    }
  }
  return false;
}

function is(obj, type) {
  return typeof obj === type;
}

function contains(str, substr) {
  return !!~('' + str).indexOf(substr);
}

if(typeof window === 'undefined'){
  module.exports = function(prop) {
    return prop;
  };
} else {
  module.exports = prefixed;
}