OSDN Git Service

git-svn-id: https://svn.sourceforge.jp/svnroot/nucleus-jp/plugin@1020 1ca29b6e-896d...
[nucleus-jp/nucleus-plugins.git] / NP_TrackBack / branches / DOM-branch / trackback / js / rico / ricoEffects.js
diff --git a/NP_TrackBack/branches/DOM-branch/trackback/js/rico/ricoEffects.js b/NP_TrackBack/branches/DOM-branch/trackback/js/rico/ricoEffects.js
new file mode 100644 (file)
index 0000000..608bb60
--- /dev/null
@@ -0,0 +1,389 @@
+ /**
+   *  (c) 2005-2007 Richard Cowin (http://openrico.org)
+   *
+   *  Rico is licensed under the Apache License, Version 2.0 (the "License"); you may not use this
+   *  file except in compliance with the License. You may obtain a copy of the License at
+   *   http://www.apache.org/licenses/LICENSE-2.0
+   **/
+
+Rico.animate = function(effect){
+       new Rico.Effect.Animator().play(effect, arguments[1]);
+}
+
+Rico.Effect = {}
+Rico.Effect.easeIn = function(step){
+  return Math.sqrt(step)
+}
+Rico.Effect.easeOut = function(step){
+  return step*step
+}
+Rico.Stepping = {}
+Rico.Stepping.easeIn = Rico.Effect.easeIn;
+Rico.Stepping.easeOut = Rico.Effect.easeOut;
+
+Rico.Effect.Animator = Class.create();
+Rico.Effect.Animator.prototype = {
+       initialize : function(effect) {
+               this.animateMethod = this.animate.bind(this);
+               this.options = arguments[1] || {};
+               this.stepsLeft = 0;
+               if (!effect) return;
+               this.reset(effect, arguments[1]);
+       },
+       reset: function(effect){
+               this.effect = effect;
+    if (arguments[1]) this.setOptions(arguments[1]);
+               this.stepsLeft = this.options.steps;
+               this.duration = this.options.duration;
+       },
+       setOptions: function(options){
+         this.options = Object.extend({
+                       steps: 10,
+                       duration: 200,
+                       rate: function(steps){ return steps;}
+    }, options|| {});
+       },
+       play: function(effect) {
+         this.setOptions(arguments[1])
+         if (effect)
+         if (effect.step)
+                 this.reset(effect, arguments[1]);
+               else{
+                 $H(effect).keys().each((function(e){
+                   var effectClass = {fadeOut:Rico.Effect.FadeOut}[e];
+                   this.reset(new effectClass(effect[e]));
+                 }).bind(this))                  
+               }
+               this.animate();
+       },
+       stop: function() {
+               this.stepsLeft = this.options.steps;
+       },
+       pause: function() {
+               this.interupt = true;
+       },
+       resume: function() {
+         this.interupt = false;
+         if (this.stepsLeft >0)
+           this.animate();
+       },
+       animate: function() {
+         if (this.interupt)
+           return;
+               if (this.stepsLeft <=0) {
+                       if (this.effect.finish)  this.effect.finish();
+                       if (this.options.onFinish) this.options.onFinish();
+                       return;
+               }
+               if (this.timer)
+                       clearTimeout(this.timer);
+               this.effect.step(this.options.rate(this.stepsLeft));
+               this.startNextStep();
+  },
+       startNextStep: function() {
+               var stepDuration = Math.round(this.duration/this.stepsLeft) ;
+    this.duration -= stepDuration;
+    this.stepsLeft--;
+    this.timer = setTimeout(this.animateMethod, stepDuration);
+       },
+  isPlaying: function(){
+    return this.stepsLeft != 0 && !this.interupt;
+  }
+}
+
+Rico.Effect.Group = Class.create();
+Rico.Effect.Group.prototype = {
+  initialize: function(effects){
+    this.effects = effects;
+  },
+  step: function(stepsToGo){ 
+    this.effects.each(function(e){e.step(stepsToGo)});
+  },
+  finish: function(){
+    this.effects.each(function(e){if (e.finish) e.finish()});
+  }
+}
+
+Rico.Effect.SizeAndPosition = Class.create();
+Rico.Effect.SizeAndPosition.prototype = {
+   initialize: function(element, x, y, w, h) {
+      this.element = $(element);
+      this.x = x || this.element.offsetLeft;
+      this.y = y || this.element.offsetTop;
+      this.w = w || this.element.offsetWidth;
+      this.h = h || this.element.offsetHeight;
+   },
+   step: function(stepsToGo) {  
+                       var left = this.element.offsetLeft + ((this.x - this.element.offsetLeft)/stepsToGo) + "px"
+                       var top = this.element.offsetTop + ((this.y - this.element.offsetTop)/stepsToGo) + "px"
+                       var width = this.element.offsetWidth + ((this.w - this.element.offsetWidth)/stepsToGo) + "px"
+                       var height = this.element.offsetHeight + ((this.h - this.element.offsetHeight)/stepsToGo) + "px"
+      var style = this.element.style;
+                       style.left = left;
+                       style.top = top;
+                       style.width = width;
+                       style.height = height;
+   }
+}
+
+Rico.AccordionEffect = Class.create();
+Rico.AccordionEffect.prototype = {
+  initialize: function(toClose, toOpen, height) {
+    this.toClose   = toClose;
+    this.toOpen    = toOpen;
+/*    if (!navigator.appVersion.match(/\bMSIE\b/)) {*/
+      Element.makeClipping(toOpen);
+      Element.makeClipping(toClose);
+/*    }*/
+    Rico.Controls.disableNativeControls(toClose);
+    Element.show(toOpen);
+    this.toOpen.style.height = "0px";
+    this.endHeight = height;
+  },
+  step: function(framesLeft) {
+     var cHeight = Math.max(1,this.toClose.offsetHeight - parseInt((parseInt(this.toClose.offsetHeight))/framesLeft));
+     var closeHeight = cHeight + "px";
+     var openHeight = (this.endHeight - cHeight) + "px"
+     this.toClose.style.height = closeHeight;
+     this.toOpen.style.height = openHeight;
+  },
+  finish: function(){
+    Element.hide(this.toClose)
+    this.toOpen.style.height = this.endHeight + "px";
+    this.toClose.style.height = "0px";
+/*    if (!navigator.appVersion.match(/\bMSIE\b/)) {*/
+      Element.undoClipping(this.toOpen);
+      Element.undoClipping(this.toClose);
+/*    }*/
+
+               Rico.Controls.enableNativeControls(this.toOpen);
+  }
+};
+
+Rico.Effect.SizeFromBottom = Class.create()
+Rico.Effect.SizeFromBottom.prototype = {
+  initialize: function(element, y, h) {
+    this.element = $(element);
+    this.y = y || this.element.offsetTop;
+    this.h = h || this.element.offsetHeight;
+    this.options  = arguments[3] || {};
+  },
+  step: function(framesToGo) {  
+               var top = this.element.offsetTop + ((this.y - this.element.offsetTop)/framesToGo) + "px"
+               var height = this.element.offsetHeight + ((this.h - this.element.offsetHeight)/framesToGo) + "px"
+    var style = this.element.style;
+               style.height = height;     
+               style.top = top;
+  }
+}
+
+Rico.Effect.Position = Class.create();
+Rico.Effect.Position.prototype = {
+  initialize: function(element, x, y) {
+    this.element = $(element);
+    this.x = x || this.element.offsetLeft;
+    this.destTop = y || this.element.offsetTop;
+  },
+  step: function(stepsToGo) {  
+       var left = this.element.offsetLeft + ((this.x - this.element.offsetLeft)/stepsToGo) + "px"
+       var top = this.element.offsetTop + ((this.destTop - this.element.offsetTop)/stepsToGo) + "px"
+    var style = this.element.style;
+       style.left = left;
+       style.top = top;
+  }
+}
+
+Rico.Effect.FadeTo = Class.create()
+Rico.Effect.FadeTo.prototype = {
+  initialize: function(element, value){
+    this.element = element;
+    this.opacity = Element.getStyle(this.element, 'opacity') || 1.0;
+    this.target = Math.min(value, 1.0);
+  },
+  step: function(framesLeft) {
+    var curOpacity = Element.getStyle(this.element, 'opacity');
+    var newOpacity = curOpacity + (this.target - curOpacity)/framesLeft
+    Rico.Effect.setOpacity(this.element, Math.min(Math.max(0,newOpacity),1.0));
+  }
+}
+
+Rico.Effect.FadeOut = Class.create()
+Rico.Effect.FadeOut.prototype = {
+  initialize: function(element){
+    this.effect = new Rico.Effect.FadeTo(element, 0.0)
+  },
+  step: function(framesLeft) {
+    this.effect.step(framesLeft);
+  }
+}
+
+Rico.Effect.FadeIn = Class.create()
+Rico.Effect.FadeIn.prototype = {
+  initialize: function(element){
+    var options = arguments[1] || {}
+    var startValue = options.startValue || 0
+    Element.setStyle(element, 'opacity', startValue);
+    this.effect = new Rico.Effect.FadeTo(element, 1.0)
+  },
+  step: function(framesLeft) {
+    this.effect.step(framesLeft);
+  }
+}
+
+Rico.Effect.setOpacity= function(element, value) {
+   element.style.filter = "alpha(opacity:"+Math.round(value*100)+")";
+   element.style.opacity = value; 
+}
+
+Rico.Effect.SizeFromTop = Class.create()
+Rico.Effect.SizeFromTop.prototype = {
+  initialize: function(element, scrollElement, y, h) {
+     this.element = $(element);
+     this.h = h || this.element.offsetHeight;
+       //       element.style.top = y;
+     this.scrollElement = scrollElement;
+     this.options  = arguments[4] || {};
+     this.baseHeight = this.options.baseHeight ||  Math.max(this.h, this.element.offsetHeight)
+  },
+  step: function(framesToGo) {  
+    var rawHeight = this.element.offsetHeight + ((this.h - this.element.offsetHeight)/framesToGo);
+               var height = rawHeight + "px"
+               var scroll = (rawHeight - this.baseHeight) + "px";
+               this.scrollElement.style.top = scroll;
+               this.element.style.height = height;     
+  }
+}
+
+
+Rico.Effect.Height = Class.create()
+Rico.Effect.Height.prototype = {
+  initialize: function(element, endHeight) {
+    this.element = element
+               this.endHeight = endHeight
+  },
+  step: function(stepsLeft) {
+    if (this.element.constructor != Array){
+      var height = this.element.offsetHeight + ((this.endHeight - this.element.offsetHeight)/stepsLeft) + "px"
+      this.element.style.height = height;
+    } else {
+      var height = this.element[0].offsetHeight + ((this.endHeight - this.element[0].offsetHeight)/stepsLeft) + "px"
+      this.element.each(function(e){e.style.height = height})
+    }
+  }
+}
+
+Rico.Effect.SizeWidth = Class.create();
+Rico.Effect.SizeWidth.prototype = {
+    initialize: function(element, endWidth) {
+      this.element = element
+                       this.endWidth = endWidth
+    },
+    step: function(stepsLeft) {
+       delta = Math.abs(this.endWidth - parseInt(this.element.offsetWidth))/(stepsLeft);
+       this.element.style.width = (this.element.offsetWidth - delta) + "px";
+    }
+}
+
+//these are to support non Safari browsers and keep controls from bleeding through on absolute positioned element.
+Rico.Controls = {
+       editors: [],
+       scrollSelectors: [],
+       
+       disableNativeControls: function(element) {
+               Rico.Controls.defaultDisabler.disableNative(element);
+  },
+       enableNativeControls: function(element){
+               Rico.Controls.defaultDisabler.enableNative(element);
+       },
+       prepareForSizing: function(element){
+    Element.makeClipping(element)
+    Rico.Controls.disableNativeControls(element)
+  },
+  resetSizing: function(element){
+    Element.undoClipping(element)
+    Rico.Controls.enableNativeControls(element)
+       },
+       registerScrollSelectors: function(selectorSet) {
+         selectorSet.each(function(s){Rico.Controls.scrollSelectors.push(Rico.selector(s))});
+       }
+}
+
+Rico.Controls.Disabler = Class.create();
+Rico.Controls.Disabler.prototype = {
+       initialize: function(){
+               this.options = Object.extend({
+                       excludeSet: [],
+                       hidables: Rico.Controls.editors
+    }, arguments[0] || {});
+       },
+  disableNative: function(element) {
+    if (!(/Konqueror|Safari|KHTML/.test(navigator.userAgent))){
+                       if (!navigator.appVersion.match(/\bMSIE\b/))
+                               this.blockControls(element).each(function(e){Element.makeClipping(e)});
+                       else
+                         this.hidableControls(element).each(function(e){e.disable()});
+    }
+  },
+  enableNative: function(element){
+    if (!(/Konqueror|Safari|KHTML/.test(navigator.userAgent))){
+                       if (!navigator.appVersion.match(/\bMSIE\b/))
+                               this.blockControls(element).each(function(e){Element.undoClipping(e)});
+                       else
+                         this.hidableControls(element).each(function(e){e.enable()});
+    }
+  },
+       blockControls: function(element){
+         try{
+               var includes = [];
+               if (this.options.includeSet)
+                       includes = this.options.includeSet;
+               else{
+                 var selectors = this.options.includeSelectors || Rico.Controls.scrollSelectors;
+                       includes = selectors.map(function(s){return s.findAll(element)}).flatten();
+    }
+               return includes.select(function(e){return (Element.getStyle(e, 'display') != 'none') && !this.options.excludeSet.include(e)}.bind(this));
+  }catch(e) { return []}
+       },
+       hidableControls: function(element){
+               if (element)
+                       return this.options.hidables.select(function(e){return Element.childOf(e, element)});
+               else
+                       return this.options.hidables;
+       }
+}      
+                    
+Rico.Controls.defaultDisabler = new Rico.Controls.Disabler();
+Rico.Controls.blankDisabler = new Rico.Controls.Disabler({includeSet:[],hidables:[]});
+                 
+Rico.Controls.HidableInput = Class.create(); 
+Rico.Controls.HidableInput.prototype = {
+       initialize: function(field, view){      
+               this.field = field;
+               this.view = view;
+               this.enable();
+               Rico.Controls.editors.push(this);
+       },
+       enable: function(){
+               Element.hide(this.view);
+               Element.show(this.field);
+       },
+       disable: function(){
+               this.view.value = $F(this.field);
+               if (this.field.offsetWidth > 1) {
+           this.view.style.width =  parseInt(this.field.offsetWidth)  + "px";
+                 Element.hide(this.field);
+                 Element.show(this.view);
+         }
+       }
+}
+
+
+
+Element.forceRefresh = function(item) {
+  try {
+    var n = document.createTextNode(' ')
+    item.appendChild(n); item.removeChild(n);
+  } catch(e) { }
+};
+
+Rico.includeLoaded('ricoEffects.js');