text: /* global $:true */
  /* global WebKitCSSMatrix:true */
  
  /**
   * zepto.js  适配器
   */
  
  (function ($) {
      "use strict";
      ['width', 'height'].forEach(function (dimension) {
          var Dimension = dimension.replace(/./, function (m) {
              return m[0].toUpperCase();
          });
          $.fn['outer' + Dimension] = function (margin) {
              var elem = this;
              if (elem) {
                  var size = elem[dimension]();
                  var sides = {
                      'width': ['left', 'right'],
                      'height': ['top', 'bottom']
                  };
                  sides[dimension].forEach(function (side) {
                      if (margin) size += parseInt(elem.css('margin-' + side), 10);
                  });
                  return size;
              } else {
                  return null;
              }
          };
      });
  
      $.noop = function () { };
  
      //support
      $.support = (function () {
          var support = {
              touch: !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch)
          };
          return support;
      })();
  
      $.touchEvents = {
          start: $.support.touch ? 'touchstart' : 'mousedown',
          move: $.support.touch ? 'touchmove' : 'mousemove',
          end: $.support.touch ? 'touchend' : 'mouseup'
      };
  
      $.getTranslate = function (el, axis) {
          var matrix, curTransform, curStyle, transformMatrix;
  
          // automatic axis detection
          if (typeof axis === 'undefined') {
              axis = 'x';
          }
  
          curStyle = window.getComputedStyle(el, null);
          if (window.WebKitCSSMatrix) {
              // Some old versions of Webkit choke when 'none' is passed; pass
              // empty string instead in this case
              transformMatrix = new WebKitCSSMatrix(curStyle.webkitTransform === 'none' ? '' : curStyle.webkitTransform);
          }
          else {
              transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
              matrix = transformMatrix.toString().split(',');
          }
  
          if (axis === 'x') {
              //Latest Chrome and webkits Fix
              if (window.WebKitCSSMatrix)
                  curTransform = transformMatrix.m41;
              //Crazy IE10 Matrix
              else if (matrix.length === 16)
                  curTransform = parseFloat(matrix[12]);
              //Normal Browsers
              else
                  curTransform = parseFloat(matrix[4]);
          }
          if (axis === 'y') {
              //Latest Chrome and webkits Fix
              if (window.WebKitCSSMatrix)
                  curTransform = transformMatrix.m42;
              //Crazy IE10 Matrix
              else if (matrix.length === 16)
                  curTransform = parseFloat(matrix[13]);
              //Normal Browsers
              else
                  curTransform = parseFloat(matrix[5]);
          }
  
          return curTransform || 0;
      };
      $.requestAnimationFrame = function (callback) {
          if (window.requestAnimationFrame) return window.requestAnimationFrame(callback);
          else if (window.webkitRequestAnimationFrame) return window.webkitRequestAnimationFrame(callback);
          else if (window.mozRequestAnimationFrame) return window.mozRequestAnimationFrame(callback);
          else {
              return window.setTimeout(callback, 1000 / 60);
          }
      };
  
      $.cancelAnimationFrame = function (id) {
          if (window.cancelAnimationFrame) return window.cancelAnimationFrame(id);
          else if (window.webkitCancelAnimationFrame) return window.webkitCancelAnimationFrame(id);
          else if (window.mozCancelAnimationFrame) return window.mozCancelAnimationFrame(id);
          else {
              return window.clearTimeout(id);
          }
      };
  
  
      $.fn.transitionEnd = function (callback) {
          var events = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd'],
              i, dom = this;
  
          function fireCallBack(e) {
              /*jshint validthis:true */
              if (e.target !== this) return;
              callback.call(this, e);
              for (i = 0; i < events.length; i++) {
                  dom.off(events[i], fireCallBack);
              }
          }
          if (callback) {
              for (i = 0; i < events.length; i++) {
                  dom.on(events[i], fireCallBack);
              }
          }
          return this;
      };
      $.fn.dataset = function () {
          var el = this[0];
          if (el) {
              var dataset = {};
              if (el.dataset) {
  
                  for (var dataKey in el.dataset) { // jshint ignore:line
                      dataset[dataKey] = el.dataset[dataKey];
                  }
              } else {
                  for (var i = 0; i < el.attributes.length; i++) {
                      var attr = el.attributes[i];
                      if (attr.name.indexOf('data-') >= 0) {
                          dataset[$.toCamelCase(attr.name.split('data-')[1])] = attr.value;
                      }
                  }
              }
              for (var key in dataset) {
                  if (dataset[key] === 'false') dataset[key] = false;
                  else if (dataset[key] === 'true') dataset[key] = true;
                  else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] = dataset[key] * 1;
              }
              return dataset;
          } else return undefined;
      };
      $.fn.data = function (key, value) {
          if (typeof value === 'undefined') {
              // Get value
              if (this[0] && this[0].getAttribute) {
                  var dataKey = this[0].getAttribute('data-' + key);
  
                  if (dataKey) {
                      return dataKey;
                  } else if (this[0].smElementDataStorage && (key in this[0].smElementDataStorage)) {
  
  
                      return this[0].smElementDataStorage[key];
  
                  } else {
                      return undefined;
                  }
              } else return undefined;
  
          } else {
              // Set value
              for (var i = 0; i < this.length; i++) {
                  var el = this[i];
                  if (!el.smElementDataStorage) el.smElementDataStorage = {};
                  el.smElementDataStorage[key] = value;
              }
              return this;
          }
      };
      $.fn.animationEnd = function (callback) {
          var events = ['webkitAnimationEnd', 'OAnimationEnd', 'MSAnimationEnd', 'animationend'],
              i, dom = this;
  
          function fireCallBack(e) {
              callback(e);
              for (i = 0; i < events.length; i++) {
                  dom.off(events[i], fireCallBack);
              }
          }
          if (callback) {
              for (i = 0; i < events.length; i++) {
                  dom.on(events[i], fireCallBack);
              }
          }
          return this;
      };
      $.fn.transition = function (duration) {
          if (typeof duration !== 'string') {
              duration = duration + 'ms';
          }
          for (var i = 0; i < this.length; i++) {
              var elStyle = this[i].style;
              elStyle.webkitTransitionDuration = elStyle.MsTransitionDuration = elStyle.msTransitionDuration = elStyle.MozTransitionDuration = elStyle.OTransitionDuration = elStyle.transitionDuration = duration;
          }
          return this;
      };
      $.fn.transform = function (transform) {
          for (var i = 0; i < this.length; i++) {
              var elStyle = this[i].style;
              elStyle.webkitTransform = elStyle.MsTransform = elStyle.msTransform = elStyle.MozTransform = elStyle.OTransform = elStyle.transform = transform;
          }
          return this;
      };
      $.fn.prevAll = function (selector) {
          var prevEls = [];
          var el = this[0];
          if (!el) return $([]);
          while (el.previousElementSibling) {
              var prev = el.previousElementSibling;
              if (selector) {
                  if ($(prev).is(selector)) prevEls.push(prev);
              }
              else prevEls.push(prev);
              el = prev;
          }
          return $(prevEls);
      };
      $.fn.nextAll = function (selector) {
          var nextEls = [];
          var el = this[0];
          if (!el) return $([]);
          while (el.nextElementSibling) {
              var next = el.nextElementSibling;
              if (selector) {
                  if ($(next).is(selector)) nextEls.push(next);
              }
              else nextEls.push(next);
              el = next;
          }
          return $(nextEls);
      };
  
      //重置zepto的show方法，防止有些人引用的版本中 show 方法操作 opacity 属性影响动画执行
      $.fn.show = function () {
          var elementDisplay = {};
          function defaultDisplay(nodeName) {
              var element, display;
              if (!elementDisplay[nodeName]) {
                  element = document.createElement(nodeName);
                  document.body.appendChild(element);
                  display = getComputedStyle(element, '').getPropertyValue("display");
                  element.parentNode.removeChild(element);
                  display === "none" && (display = "block");
                  elementDisplay[nodeName] = display;
              }
              return elementDisplay[nodeName];
          }
  
          return this.each(function () {
              this.style.display === "none" && (this.style.display = '');
              if (getComputedStyle(this, '').getPropertyValue("display") === "none");
              this.style.display = defaultDisplay(this.nodeName);
          });
      };
  
      $.fn.scrollHeight = function () {
          return this[0].scrollHeight;
      };
  })($);
  