text: /* global $:true */
  /* global WebKitCSSMatrix:true */
  
  (function($) {
    "use strict";
  
    $.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;
    };
  
    $.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'
    };
  
    $.getTouchPosition = function(e) {
      e = e.originalEvent || e; //jquery wrap the originevent
      if(e.type === 'touchstart' || e.type === 'touchmove' || e.type === 'touchend') {
        return {
          x: e.targetTouches[0].pageX,
          y: e.targetTouches[0].pageY
        };
      } else {
        return {
          x: e.pageX,
          y: e.pageY
        };
      }
    };
  
    $.fn.scrollHeight = function() {
      return this[0].scrollHeight;
    };
  
    $.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.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;
    };
  
    $.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.join = function(arg) {
      return this.toArray().join(arg);
    }
  })($);
  