Team:AHUT China/move js

(function(){

/**

* Require the module at `name`.
*
* @param {String} name
* @return {Object} exports
* @api public
*/

function require(name) {

 var module = require.modules[name];
 if (!module) throw new Error('failed to require "' + name + '"');
 if (!('exports' in module) && typeof module.definition === 'function') {
   module.client = module.component = true;
   module.definition.call(this, module.exports = {}, module);
   delete module.definition;
 }
 return module.exports;

}

/**

* Meta info, accessible in the global scope unless you use AMD option.
*/

require.loader = 'component';

/**

* Internal helper object, contains a sorting function for semantiv versioning
*/

require.helper = {}; require.helper.semVerSort = function(a, b) {

 var aArray = a.version.split('.');
 var bArray = b.version.split('.');
 for (var i=0; i<aArray.length; ++i) {
   var aInt = parseInt(aArray[i], 10);
   var bInt = parseInt(bArray[i], 10);
   if (aInt === bInt) {
     var aLex = aArray[i].substr((""+aInt).length);
     var bLex = bArray[i].substr((""+bInt).length);
     if (aLex ===  && bLex !== ) return 1;
     if (aLex !==  && bLex === ) return -1;
     if (aLex !==  && bLex !== ) return aLex > bLex ? 1 : -1;
     continue;
   } else if (aInt > bInt) {
     return 1;
   } else {
     return -1;
   }
 }
 return 0;

}

/**

* Find and require a module which name starts with the provided name.
* If multiple modules exists, the highest semver is used. 
* This function can only be used for remote dependencies.
* @param {String} name - module name: `user~repo`
* @param {Boolean} returnPath - returns the canonical require path if true, 
*                               otherwise it returns the epxorted module
*/

require.latest = function (name, returnPath) {

 function showError(name) {
   throw new Error('failed to find latest module of "' + name + '"');
 }
 // only remotes with semvers, ignore local files conataining a '/'
 var versionRegexp = /(.*)~(.*)@v?(\d+\.\d+\.\d+[^\/]*)$/;
 var remoteRegexp = /(.*)~(.*)/;
 if (!remoteRegexp.test(name)) showError(name);
 var moduleNames = Object.keys(require.modules);
 var semVerCandidates = [];
 var otherCandidates = []; // for instance: name of the git branch
 for (var i=0; i<moduleNames.length; i++) {
   var moduleName = moduleNames[i];
   if (new RegExp(name + '@').test(moduleName)) {
       var version = moduleName.substr(name.length+1);
       var semVerMatch = versionRegexp.exec(moduleName);
       if (semVerMatch != null) {
         semVerCandidates.push({version: version, name: moduleName});
       } else {
         otherCandidates.push({version: version, name: moduleName});
       } 
   }
 }
 if (semVerCandidates.concat(otherCandidates).length === 0) {
   showError(name);
 }
 if (semVerCandidates.length > 0) {
   var module = semVerCandidates.sort(require.helper.semVerSort).pop().name;
   if (returnPath === true) {
     return module;
   }
   return require(module);
 }
 // if the build contains more than one branch of the same module
 // you should not use this funciton
 var module = otherCandidates.sort(function(a, b) {return a.name > b.name})[0].name;
 if (returnPath === true) {
   return module;
 }
 return require(module);

}

/**

* Registered modules.
*/

require.modules = {};

/**

* Register module at `name` with callback `definition`.
*
* @param {String} name
* @param {Function} definition
* @api private
*/

require.register = function (name, definition) {

 require.modules[name] = {
   definition: definition
 };

};

/**

* Define a module's exports immediately with `exports`.
*
* @param {String} name
* @param {Generic} exports
* @api private
*/

require.define = function (name, exports) {

 require.modules[name] = {
   exports: exports
 };

}; require.register("component~transform-property@0.0.1", function (exports, module) {

var styles = [

 'webkitTransform',
 'MozTransform',
 'msTransform',
 'OTransform',
 'transform'

];

var el = document.createElement('p'); var style;

for (var i = 0; i < styles.length; i++) {

 style = styles[i];
 if (null != el.style[style]) {
   module.exports = style;
   break;
 }

}

});

require.register("component~has-translate3d@0.0.3", function (exports, module) {

var prop = require('component~transform-property@0.0.1');

// IE <=8 doesn't have `getComputedStyle` if (!prop || !window.getComputedStyle) {

 module.exports = false;

} else {

 var map = {
   webkitTransform: '-webkit-transform',
   OTransform: '-o-transform',
   msTransform: '-ms-transform',
   MozTransform: '-moz-transform',
   transform: 'transform'
 };
 // from: https://gist.github.com/lorenzopolidori/3794226
 var el = document.createElement('div');
 el.style[prop] = 'translate3d(1px,1px,1px)';
 document.body.insertBefore(el, null);
 var val = getComputedStyle(el).getPropertyValue(map[prop]);
 document.body.removeChild(el);
 module.exports = null != val && val.length && 'none' != val;

}

});

require.register("yields~has-transitions@1.0.0", function (exports, module) { /**

* Check if `el` or browser supports transitions.
*
* @param {Element} el
* @return {Boolean}
* @api public
*/

exports = module.exports = function(el){

 switch (arguments.length) {
   case 0: return bool;
   case 1: return bool
     ? transitions(el)
     : bool;
 }

};

/**

* Check if the given `el` has transitions.
*
* @param {Element} el
* @return {Boolean}
* @api private
*/

function transitions(el, styl){

 if (el.transition) return true;
 styl = window.getComputedStyle(el);
 return !! parseFloat(styl.transitionDuration, 10);

}

/**

* Style.
*/

var styl = document.body.style;

/**

* Export support.
*/

var bool = 'transition' in styl

 || 'webkitTransition' in styl
 || 'MozTransition' in styl
 || 'msTransition' in styl;

});

require.register("component~event@0.1.4", function (exports, module) { var bind = window.addEventListener ? 'addEventListener' : 'attachEvent',

   unbind = window.removeEventListener ? 'removeEventListener' : 'detachEvent',
   prefix = bind !== 'addEventListener' ? 'on' : ;

/**

* Bind `el` event `type` to `fn`.
*
* @param {Element} el
* @param {String} type
* @param {Function} fn
* @param {Boolean} capture
* @return {Function}
* @api public
*/

exports.bind = function(el, type, fn, capture){

 el[bind](prefix + type, fn, capture || false);
 return fn;

};

/**

* Unbind `el` event `type`'s callback `fn`.
*
* @param {Element} el
* @param {String} type
* @param {Function} fn
* @param {Boolean} capture
* @return {Function}
* @api public
*/

exports.unbind = function(el, type, fn, capture){

 el[unbind](prefix + type, fn, capture || false);
 return fn;

}; });

require.register("ecarter~css-emitter@0.0.1", function (exports, module) { /**

* Module Dependencies
*/

var events = require('component~event@0.1.4');

// CSS events

var watch = [

 'transitionend'

, 'webkitTransitionEnd' , 'oTransitionEnd' , 'MSTransitionEnd' , 'animationend' , 'webkitAnimationEnd' , 'oAnimationEnd' , 'MSAnimationEnd' ];

/**

* Expose `CSSnext`
*/

module.exports = CssEmitter;

/**

* Initialize a new `CssEmitter`
*
*/

function CssEmitter(element){

 if (!(this instanceof CssEmitter)) return new CssEmitter(element);
 this.el = element;

}

/**

* Bind CSS events.
*
* @api public
*/

CssEmitter.prototype.bind = function(fn){

 for (var i=0; i < watch.length; i++) {
   events.bind(this.el, watch[i], fn);
 }
 return this;

};

/**

* Unbind CSS events
* 
* @api public
*/

CssEmitter.prototype.unbind = function(fn){

 for (var i=0; i < watch.length; i++) {
   events.unbind(this.el, watch[i], fn);
 }
 return this;

};

/**

* Fire callback only once
* 
* @api public
*/

CssEmitter.prototype.once = function(fn){

 var self = this;
 function on(){
   self.unbind(on);
   fn.apply(self.el, arguments);
 }
 self.bind(on);
 return this;

};


});

require.register("component~once@0.0.1", function (exports, module) {

/**

* Identifier.
*/

var n = 0;

/**

* Global.
*/

var global = (function(){ return this })();

/**

* Make `fn` callable only once.
*
* @param {Function} fn
* @return {Function}
* @api public
*/

module.exports = function(fn) {

 var id = n++;
 function once(){
   // no receiver
   if (this == global) {
     if (once.called) return;
     once.called = true;
     return fn.apply(this, arguments);
   }
   // receiver
   var key = '__called_' + id + '__';
   if (this[key]) return;
   this[key] = true;
   return fn.apply(this, arguments);
 }
 return once;

};

});

require.register("yields~after-transition@0.0.1", function (exports, module) {

/**

* dependencies
*/

var has = require('yields~has-transitions@1.0.0')

 , emitter = require('ecarter~css-emitter@0.0.1')
 , once = require('component~once@0.0.1');

/**

* Transition support.
*/

var supported = has();

/**

* Export `after`
*/

module.exports = after;

/**

* Invoke the given `fn` after transitions
*
* It will be invoked only if the browser
* supports transitions __and__
* the element has transitions
* set in `.style` or css.
*
* @param {Element} el
* @param {Function} fn
* @return {Function} fn
* @api public
*/

function after(el, fn){

 if (!supported || !has(el)) return fn();
 emitter(el).bind(fn);
 return fn;

};

/**

* Same as `after()` only the function is invoked once.
*
* @param {Element} el
* @param {Function} fn
* @return {Function}
* @api public
*/

after.once = function(el, fn){

 var callback = once(fn);
 after(el, fn = function(){
   emitter(el).unbind(fn);
   callback();
 });

};

});

require.register("component~emitter@1.2.0", function (exports, module) {

/**

* Expose `Emitter`.
*/

module.exports = Emitter;

/**

* Initialize a new `Emitter`.
*
* @api public
*/

function Emitter(obj) {

 if (obj) return mixin(obj);

};

/**

* Mixin the emitter properties.
*
* @param {Object} obj
* @return {Object}
* @api private
*/

function mixin(obj) {

 for (var key in Emitter.prototype) {
   obj[key] = Emitter.prototype[key];
 }
 return obj;

}

/**

* Listen on the given `event` with `fn`.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/

Emitter.prototype.on = Emitter.prototype.addEventListener = function(event, fn){

 this._callbacks = this._callbacks || {};
 (this._callbacks['$' + event] = this._callbacks['$' + event] || [])
   .push(fn);
 return this;

};

/**

* Adds an `event` listener that will be invoked a single
* time then automatically removed.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/

Emitter.prototype.once = function(event, fn){

 function on() {
   this.off(event, on);
   fn.apply(this, arguments);
 }
 on.fn = fn;
 this.on(event, on);
 return this;

};

/**

* Remove the given callback for `event` or all
* registered callbacks.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/

Emitter.prototype.off = Emitter.prototype.removeListener = Emitter.prototype.removeAllListeners = Emitter.prototype.removeEventListener = function(event, fn){

 this._callbacks = this._callbacks || {};
 // all
 if (0 == arguments.length) {
   this._callbacks = {};
   return this;
 }
 // specific event
 var callbacks = this._callbacks['$' + event];
 if (!callbacks) return this;
 // remove all handlers
 if (1 == arguments.length) {
   delete this._callbacks['$' + event];
   return this;
 }
 // remove specific handler
 var cb;
 for (var i = 0; i < callbacks.length; i++) {
   cb = callbacks[i];
   if (cb === fn || cb.fn === fn) {
     callbacks.splice(i, 1);
     break;
   }
 }
 return this;

};

/**

* Emit `event` with the given args.
*
* @param {String} event
* @param {Mixed} ...
* @return {Emitter}
*/

Emitter.prototype.emit = function(event){

 this._callbacks = this._callbacks || {};
 var args = [].slice.call(arguments, 1)
   , callbacks = this._callbacks['$' + event];
 if (callbacks) {
   callbacks = callbacks.slice(0);
   for (var i = 0, len = callbacks.length; i < len; ++i) {
     callbacks[i].apply(this, args);
   }
 }
 return this;

};

/**

* Return array of callbacks for `event`.
*
* @param {String} event
* @return {Array}
* @api public
*/

Emitter.prototype.listeners = function(event){

 this._callbacks = this._callbacks || {};
 return this._callbacks['$' + event] || [];

};

/**

* Check if this emitter has `event` handlers.
*
* @param {String} event
* @return {Boolean}
* @api public
*/

Emitter.prototype.hasListeners = function(event){

 return !! this.listeners(event).length;

};

});

require.register("yields~css-ease@0.0.1", function (exports, module) {

/**

* CSS Easing functions
*/

module.exports = {

   'in':                'ease-in'
 , 'out':               'ease-out'
 , 'in-out':            'ease-in-out'
 , 'snap':              'cubic-bezier(0,1,.5,1)'
 , 'linear':            'cubic-bezier(0.250, 0.250, 0.750, 0.750)'
 , 'ease-in-quad':      'cubic-bezier(0.550, 0.085, 0.680, 0.530)'
 , 'ease-in-cubic':     'cubic-bezier(0.550, 0.055, 0.675, 0.190)'
 , 'ease-in-quart':     'cubic-bezier(0.895, 0.030, 0.685, 0.220)'
 , 'ease-in-quint':     'cubic-bezier(0.755, 0.050, 0.855, 0.060)'
 , 'ease-in-sine':      'cubic-bezier(0.470, 0.000, 0.745, 0.715)'
 , 'ease-in-expo':      'cubic-bezier(0.950, 0.050, 0.795, 0.035)'
 , 'ease-in-circ':      'cubic-bezier(0.600, 0.040, 0.980, 0.335)'
 , 'ease-in-back':      'cubic-bezier(0.600, -0.280, 0.735, 0.045)'
 , 'ease-out-quad':     'cubic-bezier(0.250, 0.460, 0.450, 0.940)'
 , 'ease-out-cubic':    'cubic-bezier(0.215, 0.610, 0.355, 1.000)'
 , 'ease-out-quart':    'cubic-bezier(0.165, 0.840, 0.440, 1.000)'
 , 'ease-out-quint':    'cubic-bezier(0.230, 1.000, 0.320, 1.000)'
 , 'ease-out-sine':     'cubic-bezier(0.390, 0.575, 0.565, 1.000)'
 , 'ease-out-expo':     'cubic-bezier(0.190, 1.000, 0.220, 1.000)'
 , 'ease-out-circ':     'cubic-bezier(0.075, 0.820, 0.165, 1.000)'
 , 'ease-out-back':     'cubic-bezier(0.175, 0.885, 0.320, 1.275)'
 , 'ease-out-quad':     'cubic-bezier(0.455, 0.030, 0.515, 0.955)'
 , 'ease-out-cubic':    'cubic-bezier(0.645, 0.045, 0.355, 1.000)'
 , 'ease-in-out-quart': 'cubic-bezier(0.770, 0.000, 0.175, 1.000)'
 , 'ease-in-out-quint': 'cubic-bezier(0.860, 0.000, 0.070, 1.000)'
 , 'ease-in-out-sine':  'cubic-bezier(0.445, 0.050, 0.550, 0.950)'
 , 'ease-in-out-expo':  'cubic-bezier(1.000, 0.000, 0.000, 1.000)'
 , 'ease-in-out-circ':  'cubic-bezier(0.785, 0.135, 0.150, 0.860)'
 , 'ease-in-out-back':  'cubic-bezier(0.680, -0.550, 0.265, 1.550)'

};

});

require.register("component~query@0.0.3", function (exports, module) { function one(selector, el) {

 return el.querySelector(selector);

}

exports = module.exports = function(selector, el){

 el = el || document;
 return one(selector, el);

};

exports.all = function(selector, el){

 el = el || document;
 return el.querySelectorAll(selector);

};

exports.engine = function(obj){

 if (!obj.one) throw new Error('.one callback required');
 if (!obj.all) throw new Error('.all callback required');
 one = obj.one;
 exports.all = obj.all;
 return exports;

};

});

require.register("move", function (exports, module) { /**

* Module Dependencies.
*/

var Emitter = require('component~emitter@1.2.0'); var query = require('component~query@0.0.3'); var after = require('yields~after-transition@0.0.1'); var has3d = require('component~has-translate3d@0.0.3'); var ease = require('yields~css-ease@0.0.1');

/**

* CSS Translate
*/

var translate = has3d

 ? ['translate3d(', ', 0)']
 : ['translate(', ')'];

/**

* Export `Move`
*/

module.exports = Move;

/**

* Get computed style.
*/

var style = window.getComputedStyle

 || window.currentStyle;

/**

* Library version.
*/

Move.version = '0.5.0';

/**

* Export `ease`
*/

Move.ease = ease;

/**

* Defaults.
*
*   `duration` - default duration of 500ms
*
*/

Move.defaults = {

 duration: 500

};

/**

* Default element selection utilized by `move(selector)`.
*
* Override to implement your own selection, for example
* with jQuery one might write:
*
*     move.select = function(selector) {
*       return jQuery(selector).get(0);
*     };
*
* @param {Object|String} selector
* @return {Element}
* @api public
*/

Move.select = function(selector){

 if ('string' != typeof selector) return selector;
 return query(selector);

};

/**

* Initialize a new `Move` with the given `el`.
*
* @param {Element} el
* @api public
*/

function Move(el) {

 if (!(this instanceof Move)) return new Move(el);
 if ('string' == typeof el) el = query(el);
 if (!el) throw new TypeError('Move must be initialized with element or selector');
 this.el = el;
 this._props = {};
 this._rotate = 0;
 this._transitionProps = [];
 this._transforms = [];
 this.duration(Move.defaults.duration)

};


/**

* Inherit from `EventEmitter.prototype`.
*/

Emitter(Move.prototype);

/**

* Buffer `transform`.
*
* @param {String} transform
* @return {Move} for chaining
* @api private
*/

Move.prototype.transform = function(transform){

 this._transforms.push(transform);
 return this;

};

/**

* Skew `x` and `y`.
*
* @param {Number} x
* @param {Number} y
* @return {Move} for chaining
* @api public
*/

Move.prototype.skew = function(x, y){

 return this.transform('skew('
   + x + 'deg, '
   + (y || 0)
   + 'deg)');

};

/**

* Skew x by `n`.
*
* @param {Number} n
* @return {Move} for chaining
* @api public
*/

Move.prototype.skewX = function(n){

 return this.transform('skewX(' + n + 'deg)');

};

/**

* Skew y by `n`.
*
* @param {Number} n
* @return {Move} for chaining
* @api public
*/

Move.prototype.skewY = function(n){

 return this.transform('skewY(' + n + 'deg)');

};

/**

* Translate `x` and `y` axis.
*
* @param {Number} x
* @param {Number} y
* @return {Move} for chaining
* @api public
*/

Move.prototype.translate = Move.prototype.to = function(x, y){

 return this.transform(translate.join(
   + x +'px, '
   + (y || 0)
   + 'px'));

};

/**

* Translate on the x axis to `n`.
*
* @param {Number} n
* @return {Move} for chaining
* @api public
*/

Move.prototype.translateX = Move.prototype.x = function(n){

 return this.transform('translateX(' + n + 'px)');

};

/**

* Translate on the y axis to `n`.
*
* @param {Number} n
* @return {Move} for chaining
* @api public
*/

Move.prototype.translateY = Move.prototype.y = function(n){

 return this.transform('translateY(' + n + 'px)');

};

/**

* Scale the x and y axis by `x`, or
* individually scale `x` and `y`.
*
* @param {Number} x
* @param {Number} y
* @return {Move} for chaining
* @api public
*/

Move.prototype.scale = function(x, y){

 return this.transform('scale('
   + x + ', '
   + (y || x)
   + ')');

};

/**

* Scale x axis by `n`.
*
* @param {Number} n
* @return {Move} for chaining
* @api public
*/

Move.prototype.scaleX = function(n){

 return this.transform('scaleX(' + n + ')')

};

/**

* Apply a matrix transformation
*
* @param {Number} m11 A matrix coefficient
* @param {Number} m12 A matrix coefficient
* @param {Number} m21 A matrix coefficient
* @param {Number} m22 A matrix coefficient
* @param {Number} m31 A matrix coefficient
* @param {Number} m32 A matrix coefficient
* @return {Move} for chaining
* @api public
*/

Move.prototype.matrix = function(m11, m12, m21, m22, m31, m32){

 return this.transform('matrix(' + [m11,m12,m21,m22,m31,m32].join(',') + ')');

};

/**

* Scale y axis by `n`.
*
* @param {Number} n
* @return {Move} for chaining
* @api public
*/

Move.prototype.scaleY = function(n){

 return this.transform('scaleY(' + n + ')')

};

/**

* Rotate `n` degrees.
*
* @param {Number} n
* @return {Move} for chaining
* @api public
*/

Move.prototype.rotate = function(n){

 return this.transform('rotate(' + n + 'deg)');

};

/**

* Set transition easing function to to `fn` string.
*
* When:
*
*   - null "ease" is used
*   - "in" "ease-in" is used
*   - "out" "ease-out" is used
*   - "in-out" "ease-in-out" is used
*
* @param {String} fn
* @return {Move} for chaining
* @api public
*/

Move.prototype.ease = function(fn){

 fn = ease[fn] || fn || 'ease';
 return this.setVendorProperty('transition-timing-function', fn);

};

/**

* Set animation properties
*
* @param {String} name
* @param {Object} props
* @return {Move} for chaining
* @api public
*/

Move.prototype.animate = function(name, props){

 for (var i in props){
   if (props.hasOwnProperty(i)){
     this.setVendorProperty('animation-' + i, props[i])
   }
 }
 return this.setVendorProperty('animation-name', name);

}

/**

* Set duration to `n`.
*
* @param {Number|String} n
* @return {Move} for chaining
* @api public
*/

Move.prototype.duration = function(n){

 n = this._duration = 'string' == typeof n
   ? parseFloat(n) * 1000
   : n;
 return this.setVendorProperty('transition-duration', n + 'ms');

};

/**

* Delay the animation by `n`.
*
* @param {Number|String} n
* @return {Move} for chaining
* @api public
*/

Move.prototype.delay = function(n){

 n = 'string' == typeof n
   ? parseFloat(n) * 1000
   : n;
 return this.setVendorProperty('transition-delay', n + 'ms');

};

/**

* Set `prop` to `val`, deferred until `.end()` is invoked.
*
* @param {String} prop
* @param {String} val
* @return {Move} for chaining
* @api public
*/

Move.prototype.setProperty = function(prop, val){

 this._props[prop] = val;
 return this;

};

/**

* Set a vendor prefixed `prop` with the given `val`.
*
* @param {String} prop
* @param {String} val
* @return {Move} for chaining
* @api public
*/

Move.prototype.setVendorProperty = function(prop, val){

 this.setProperty('-webkit-' + prop, val);
 this.setProperty('-moz-' + prop, val);
 this.setProperty('-ms-' + prop, val);
 this.setProperty('-o-' + prop, val);
 return this;

};

/**

* Set `prop` to `value`, deferred until `.end()` is invoked
* and adds the property to the list of transition props.
*
* @param {String} prop
* @param {String} val
* @return {Move} for chaining
* @api public
*/

Move.prototype.set = function(prop, val){

 this.transition(prop);
 this._props[prop] = val;
 return this;

};

/**

* Increment `prop` by `val`, deferred until `.end()` is invoked
* and adds the property to the list of transition props.
*
* @param {String} prop
* @param {Number} val
* @return {Move} for chaining
* @api public
*/

Move.prototype.add = function(prop, val){

 if (!style) return;
 var self = this;
 return this.on('start', function(){
   var curr = parseInt(self.current(prop), 10);
   self.set(prop, curr + val + 'px');
 });

};

/**

* Decrement `prop` by `val`, deferred until `.end()` is invoked
* and adds the property to the list of transition props.
*
* @param {String} prop
* @param {Number} val
* @return {Move} for chaining
* @api public
*/

Move.prototype.sub = function(prop, val){

 if (!style) return;
 var self = this;
 return this.on('start', function(){
   var curr = parseInt(self.current(prop), 10);
   self.set(prop, curr - val + 'px');
 });

};

/**

* Get computed or "current" value of `prop`.
*
* @param {String} prop
* @return {String}
* @api public
*/

Move.prototype.current = function(prop){

 return style(this.el).getPropertyValue(prop);

};

/**

* Add `prop` to the list of internal transition properties.
*
* @param {String} prop
* @return {Move} for chaining
* @api private
*/

Move.prototype.transition = function(prop){

 if (!this._transitionProps.indexOf(prop)) return this;
 this._transitionProps.push(prop);
 return this;

};

/**

* Commit style properties, aka apply them to `el.style`.
*
* @return {Move} for chaining
* @see Move#end()
* @api private
*/

Move.prototype.applyProperties = function(){

 for (var prop in this._props) {
   this.el.style.setProperty(prop, this._props[prop], );
 }
 return this;

};

/**

* Re-select element via `selector`, replacing
* the current element.
*
* @param {String} selector
* @return {Move} for chaining
* @api public
*/

Move.prototype.move = Move.prototype.select = function(selector){

 this.el = Move.select(selector);
 return this;

};

/**

* Defer the given `fn` until the animation
* is complete. `fn` may be one of the following:
*
*   - a function to invoke
*   - an instanceof `Move` to call `.end()`
*   - nothing, to return a clone of this `Move` instance for chaining
*
* @param {Function|Move} fn
* @return {Move} for chaining
* @api public
*/

Move.prototype.then = function(fn){

 // invoke .end()
 if (fn instanceof Move) {
   this.on('end', function(){
     fn.end();
   });
 // callback
 } else if ('function' == typeof fn) {
   this.on('end', fn);
 // chain
 } else {
   var clone = new Move(this.el);
   clone._transforms = this._transforms.slice(0);
   this.then(clone);
   clone.parent = this;
   return clone;
 }
 return this;

};

/**

* Pop the move context.
*
* @return {Move} parent Move
* @api public
*/

Move.prototype.pop = function(){

 return this.parent;

};

/**

* Reset duration.
*
* @return {Move}
* @api public
*/

Move.prototype.reset = function(){

 this.el.style.webkitTransitionDuration =
 this.el.style.mozTransitionDuration =
 this.el.style.msTransitionDuration =
 this.el.style.oTransitionDuration = ;
 return this;

};

/**

* Start animation, optionally calling `fn` when complete.
*
* @param {Function} fn
* @return {Move} for chaining
* @api public
*/

Move.prototype.end = function(fn){

 var self = this;
 // emit "start" event
 this.emit('start');
 // transforms
 if (this._transforms.length) {
   this.setVendorProperty('transform', this._transforms.join(' '));
 }
 // transition properties
 this.setVendorProperty('transition-properties', this._transitionProps.join(', '));
 this.applyProperties();
 // callback given
 if (fn) this.then(fn);
 // emit "end" when complete
 after.once(this.el, function(){
   self.reset();
   self.emit('end');
 });
 return this;

};

});

if (typeof exports == "object") {

 module.exports = require("move");

} else if (typeof define == "function" && define.amd) {

 define("move", [], function(){ return require("move"); });

} else {

 (this || window)["move"] = require("move");

} })()