--- /dev/null
+/*\r
+ * L.Transition native implementation that powers Leaflet animation \r
+ * in browsers that support CSS3 Transitions\r
+ */\r
+\r
+L.Transition = L.Transition.extend({\r
+ statics: (function() {\r
+ var transition = L.DomUtil.TRANSITION,\r
+ transitionEnd = (transition == 'webkitTransition' || transition == 'OTransition' ? \r
+ transition + 'End' : 'transitionend');\r
+ \r
+ return {\r
+ NATIVE: !!transition,\r
+ \r
+ TRANSITION: transition,\r
+ PROPERTY: transition + 'Property',\r
+ DURATION: transition + 'Duration',\r
+ EASING: transition + 'TimingFunction',\r
+ END: transitionEnd,\r
+ \r
+ // transition-property value to use with each particular custom property\r
+ CUSTOM_PROPS_PROPERTIES: {\r
+ position: L.Browser.webkit ? L.DomUtil.TRANSFORM : 'top, left'\r
+ }\r
+ };\r
+ })(),\r
+ \r
+ options: {\r
+ fakeStepInterval: 100\r
+ },\r
+ \r
+ initialize: function(/*HTMLElement*/ el, /*Object*/ options) {\r
+ this._el = el;\r
+ L.Util.setOptions(this, options);\r
+\r
+ L.DomEvent.addListener(el, L.Transition.END, this._onTransitionEnd, this);\r
+ this._onFakeStep = L.Util.bind(this._onFakeStep, this);\r
+ },\r
+ \r
+ run: function(/*Object*/ props) {\r
+ var prop,\r
+ propsList = [],\r
+ customProp = L.Transition.CUSTOM_PROPS_PROPERTIES;\r
+ \r
+ for (prop in props) {\r
+ if (props.hasOwnProperty(prop)) {\r
+ prop = customProp[prop] ? customProp[prop] : prop;\r
+ prop = prop.replace(/([A-Z])/g, function(w) { return '-' + w.toLowerCase(); });\r
+ propsList.push(prop);\r
+ }\r
+ }\r
+ \r
+ this._el.style[L.Transition.DURATION] = this.options.duration + 's';\r
+ this._el.style[L.Transition.EASING] = this.options.easing;\r
+ this._el.style[L.Transition.PROPERTY] = propsList.join(', ');\r
+ \r
+ for (prop in props) {\r
+ if (props.hasOwnProperty(prop)) {\r
+ this._setProperty(prop, props[prop]);\r
+ }\r
+ }\r
+ \r
+ this._inProgress = true;\r
+ \r
+ this.fire('start');\r
+ \r
+ if (L.Transition.NATIVE) {\r
+ this._timer = setInterval(this._onFakeStep, this.options.fakeStepInterval);\r
+ } else {\r
+ this._onTransitionEnd();\r
+ }\r
+ },\r
+ \r
+ _onFakeStep: function() {\r
+ this.fire('step');\r
+ },\r
+ \r
+ _onTransitionEnd: function() {\r
+ if (this._inProgress) {\r
+ this._inProgress = false;\r
+ clearInterval(this._timer);\r
+ \r
+ this._el.style[L.Transition.PROPERTY] = 'none';\r
+ \r
+ this.fire('step');\r
+ this.fire('end');\r
+ }\r
+ }\r
+});
\ No newline at end of file