code: function transformMapping(name, value)
  {
      var easing, dirs = ['X', 'Y', 'Z'], values = {}, parts, baseName;
      if(isArray(value))
      {
          value = value[0];
          easing = value[1];
      }
      else
      {
          easing = null;
      }
  
      parts = String(value).split(/\s*,\s*/);
      baseName = name.indexOf('3') !== -1? name.substr(0, name.length - 2) : name;
  
      if(name == 'rotate3d')
      {
          if(parts.length == 4)
          {
              dirs = [parts[0] == '1'? 'X' : (parts[1] == '1'? 'Y' : 'Z')];
              parts[0] = parts[3];
          }
          else
          {
              throw 'invalid rotate 3d value';
          }
      }
      else
      {
          switch(parts.length)
          {
              // for rotations, a single value is passed as Z-value, while for other transforms it is applied to X and Y
              case 1:
                  parts = baseName == 'rotate' || baseName == 'rotation'? [null, null, parts[0]] : [parts[0], parts[0], null];
              break;
  
              case 2:
                  parts = [parts[0], parts[1], null];
              break;
          }
  
      }
  
      for(var i = 0; i < dirs.length; i++)
      {
          if(parts[i] !== null)
          {
              values[baseName + dirs[i]] = easing? [parts[i], easing] : parts[i];
          }
      }
      return values;
  }
docs: split commpound transform values
  
  scale: 1.2 => scaleX: 1.2, scaleY: 1.2
  rotate3d: 30, 60, 40 => rotateX: 30, rotateY: 60, rotateZ: 40
  
  @param {string} name
  @param {string} value
  @returns {object}