home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / AIMP2 / aimp_2.61.583.exe / $TEMP / YandexPackSetup.msi / fil9F405C34CBE14EB5CE361B8D2C52156E < prev    next >
Text File  |  2010-07-12  |  4KB  |  148 lines

  1. let EXPORTED_SYMBOLS = ["Effects"];
  2.  
  3. const Cc = Components.classes;
  4. const Ci = Components.interfaces;
  5.  
  6. var gAnimators = [];
  7.  
  8. var observerServiceWrapper = {
  9.   _observerService: Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService),
  10.   
  11.   addObserver: function(aObject, aTopic) {
  12.     return this._observerService.addObserver(aObject, aTopic, false);
  13.   },
  14.   
  15.   removeObserver: function(aObject, aTopic) {
  16.     return this._observerService.removeObserver(aObject, aTopic, false);
  17.   }
  18. };
  19.  
  20. var gCleaner = {
  21.   init: function() {
  22.     observerServiceWrapper.addObserver(this, "xpcom-shutdown");
  23.   },
  24.   
  25.   shutdown: function() {
  26.     while (gAnimators.length) {
  27.       gAnimators.pop().finish();
  28.     }
  29.     
  30.     gAnimators = null;
  31.     
  32.     observerServiceWrapper.removeObserver(this, "xpcom-shutdown");
  33.   },
  34.   
  35.   observe: function(aSubject, aTopic, aData) {
  36.     if (aTopic === "xpcom-shutdown")
  37.       this.shutdown();
  38.   }
  39. };
  40.  
  41. gCleaner.init();
  42.  
  43. function Animator(aNode, aParams, aOptions, aCallback, maxTimes) {
  44.   this._node = aNode;
  45.   
  46.   this._params = aParams;
  47.   this._options = aOptions;
  48.   this._callback = aCallback;
  49.   
  50.   this._timer = null;
  51.   this._timerCounter = 0;
  52.   this._maxTimes = maxTimes;
  53.   
  54.   this._timerInterval = parseInt(this._options.duration / this._maxTimes, 10);
  55.   
  56.   gAnimators.push(this);
  57.   
  58.   this.start();
  59. }
  60.  
  61. Animator.prototype = {
  62.   _destroy: function() {
  63.     if (!this._timer)
  64.       return;
  65.     
  66.     let timer = this._timer;
  67.     gAnimators = gAnimators.filter(function(anim) { return anim._timer !== timer; });
  68.     
  69.     this._timer.cancel();
  70.     this._timer = null;
  71.     this._timerCounter = null;
  72.     this._maxTimes = null;
  73.     this._timerInterval = null;
  74.     
  75.     this._node = null;
  76.     this._params = null;
  77.     this._options = null;
  78.     this._callback = null;
  79.   },
  80.   
  81.   start: function() {
  82.     this._timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
  83.     this._timer.initWithCallback(this, this._timerInterval, Ci.nsITimer.TYPE_REPEATING_SLACK);
  84.   },
  85.   
  86.   stop: function() {
  87.     if (this._callback)
  88.       this._callback();
  89.     
  90.     this._destroy();
  91.   },
  92.   
  93.   finish: function() {
  94.     if (this._timer) {
  95.       this._timerCounter = this._maxTimes;
  96.       this.notify(this._timer);
  97.     }
  98.   },
  99.   
  100.   notify: function(aTimer) {
  101.     this._timerCounter++;
  102.     
  103.     try {
  104.       let style = this._node.style;
  105.       for (let [paramName, paramValue] in Iterator(this._params)) {
  106.         style[paramName] = paramValue.from + (paramValue.step * this._timerCounter) + paramValue.unit;
  107.       }
  108.     } catch(e) {
  109.       this._timerCounter = this._maxTimes;
  110.     }
  111.     
  112.     if (this._timerCounter >= this._maxTimes)
  113.       this.stop();
  114.   }
  115. }
  116.  
  117. var Effects = {
  118.   hide: function(aElement) {},
  119.   
  120.   show: function(aElement) {},
  121.   
  122.   animate: function(aNode, aParams, aOptions, aCallback) {
  123.     let options = aOptions && typeof aOptions == "object" ? aOptions : {};
  124.     if (!("duration" in options)) {
  125.       options.duration = typeof aOptions == "number" ? aOptions : 200;
  126.     }
  127.     
  128.     let maxTimes = 8;
  129.     
  130.     let params = {};
  131.     let nodeStyle = aNode.ownerDocument.defaultView.getComputedStyle(aNode, "");
  132.     for (let [paramName, paramValue] in Iterator(aParams)) {
  133.       let currValue = parseFloat(nodeStyle[paramName]);
  134.       let step = (paramValue - currValue) / maxTimes;
  135.       
  136.       if (step) {
  137.         params[paramName] = {
  138.           from: currValue,
  139.           to: paramValue,
  140.           step: step,
  141.           unit: /([a-z]+)/.test(nodeStyle[paramName]) ? RegExp.$1 : ""
  142.         };
  143.       }
  144.     }
  145.     
  146.     return new Animator(aNode, params, options, aCallback, maxTimes);
  147.   }
  148. };