| /* | |
| * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved. | |
| * | |
| * This program and the accompanying materials are made available under the | |
| * terms of the Eclipse Public License v. 2.0, which is available at | |
| * http://www.eclipse.org/legal/epl-2.0. | |
| * | |
| * This Source Code may also be made available under the following Secondary | |
| * Licenses when the conditions for such availability set forth in the | |
| * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, | |
| * version 2 with the GNU Classpath Exception, which is available at | |
| * https://www.gnu.org/software/classpath/license.html. | |
| * | |
| * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 | |
| */ | |
| var Fx = fx = {}; | |
| Fx.Base = function(){}; | |
| Fx.Base.prototype = { | |
| setOptions: function(options){ | |
| this.options = Object.extend({ | |
| onStart: function(){}, | |
| onComplete: function(){}, | |
| duration: 500, | |
| unit: 'px', | |
| wait: true, | |
| fps: 50 | |
| }, options || {}); | |
| }, | |
| step: function(){ | |
| var time = new Date().getTime(); | |
| if (time < this.time + this.options.duration){ | |
| this.cTime = time - this.time; | |
| this.setNow(); | |
| } else { | |
| setTimeout(this.options.onComplete.bind(this, this.element), 10); | |
| this.clearTimer(); | |
| this.now = this.to; | |
| } | |
| this.increase(); | |
| }, | |
| setNow: function(){ | |
| this.now = this.compute(this.from, this.to); | |
| }, | |
| compute: function(from, to){ | |
| var change = to - from; | |
| return this.options.transition(this.cTime, from, change, this.options.duration); | |
| }, | |
| clearTimer: function(){ | |
| clearInterval(this.timer); | |
| this.timer = null; | |
| return this; | |
| }, | |
| _start: function(from, to){ | |
| if (!this.options.wait) this.clearTimer(); | |
| if (this.timer) return; | |
| setTimeout(this.options.onStart.bind(this, this.element), 10); | |
| this.from = from; | |
| this.to = to; | |
| this.time = new Date().getTime(); | |
| this.timer = setInterval(this.step.bind(this), Math.round(1000/this.options.fps)); | |
| return this; | |
| }, | |
| custom: function(from, to){ | |
| return this._start(from, to); | |
| }, | |
| set: function(to){ | |
| this.now = to; | |
| this.increase(); | |
| return this; | |
| }, | |
| hide: function(){ | |
| return this.set(0); | |
| }, | |
| setStyle: function(e, p, v){ | |
| if (p == 'opacity'){ | |
| if (v == 0 && e.style.visibility != "hidden") e.style.visibility = "hidden"; | |
| else if (e.style.visibility != "visible") e.style.visibility = "visible"; | |
| if (window.ActiveXObject) e.style.filter = "alpha(opacity=" + v*100 + ")"; | |
| e.style.opacity = v; | |
| } else e.style[p] = v+this.options.unit; | |
| } | |
| }; | |
| Fx.Style = Class.create(); | |
| Fx.Style.prototype = Object.extend(new Fx.Base(), { | |
| initialize: function(el, property, options){ | |
| this.element = $(el); | |
| this.setOptions(options); | |
| this.property = property.camelize(); | |
| }, | |
| increase: function(){ | |
| this.setStyle(this.element, this.property, this.now); | |
| } | |
| }); | |
| Fx.Styles = Class.create(); | |
| Fx.Styles.prototype = Object.extend(new Fx.Base(), { | |
| initialize: function(el, options){ | |
| this.element = $(el); | |
| this.setOptions(options); | |
| this.now = {}; | |
| }, | |
| setNow: function(){ | |
| for (p in this.from) this.now[p] = this.compute(this.from[p], this.to[p]); | |
| }, | |
| custom: function(obj){ | |
| if (this.timer && this.options.wait) return; | |
| var from = {}; | |
| var to = {}; | |
| for (p in obj){ | |
| from[p] = obj[p][0]; | |
| to[p] = obj[p][1]; | |
| } | |
| return this._start(from, to); | |
| }, | |
| increase: function(){ | |
| for (var p in this.now) this.setStyle(this.element, p, this.now[p]); | |
| } | |
| }); |