Author: dashorst
Date: Sun Apr 15 14:21:42 2007
New Revision: 529073

URL: http://svn.apache.org/viewvc?view=rev&rev=529073
Log:
Added animation stuff to personal sandbox, to prevent disasters when drive 
crashes

Added:
    incubator/wicket/sandbox/dashorst/animation/
    incubator/wicket/sandbox/dashorst/animation/Untitled.png   (with props)
    incubator/wicket/sandbox/dashorst/animation/animator.js   (with props)
    incubator/wicket/sandbox/dashorst/animation/apache.png   (with props)
    incubator/wicket/sandbox/dashorst/animation/apache2.png   (with props)
    incubator/wicket/sandbox/dashorst/animation/common.js   (with props)
    incubator/wicket/sandbox/dashorst/animation/incubating.png   (with props)
    incubator/wicket/sandbox/dashorst/animation/index.html   (with props)
    incubator/wicket/sandbox/dashorst/animation/logo-bottom.png   (with props)
    incubator/wicket/sandbox/dashorst/animation/logo-bottom2.png   (with props)
    incubator/wicket/sandbox/dashorst/animation/logo-top.png   (with props)
    incubator/wicket/sandbox/dashorst/animation/style.css   (with props)
    incubator/wicket/sandbox/dashorst/animation/wicket-logo.png   (with props)
    incubator/wicket/sandbox/dashorst/animation/wicket.png   (with props)
    incubator/wicket/sandbox/dashorst/animation/wicket2.png   (with props)
    incubator/wicket/sandbox/dashorst/animation/yahoo.html   (with props)

Added: incubator/wicket/sandbox/dashorst/animation/Untitled.png
URL: 
http://svn.apache.org/viewvc/incubator/wicket/sandbox/dashorst/animation/Untitled.png?view=auto&rev=529073
==============================================================================
Binary file - no diff available.

Propchange: incubator/wicket/sandbox/dashorst/animation/Untitled.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: incubator/wicket/sandbox/dashorst/animation/animator.js
URL: 
http://svn.apache.org/viewvc/incubator/wicket/sandbox/dashorst/animation/animator.js?view=auto&rev=529073
==============================================================================
--- incubator/wicket/sandbox/dashorst/animation/animator.js (added)
+++ incubator/wicket/sandbox/dashorst/animation/animator.js Sun Apr 15 14:21:42 
2007
@@ -0,0 +1,642 @@
+/*  
+       Animator.js 1.1.6
+       
+       This library is released under the BSD license:
+
+       Copyright (c) 2006, Bernard Sumption. All rights reserved.
+       
+       Redistribution and use in source and binary forms, with or without
+       modification, are permitted provided that the following conditions are 
met:
+       
+       Redistributions of source code must retain the above copyright notice, 
this
+       list of conditions and the following disclaimer. Redistributions in 
binary
+       form must reproduce the above copyright notice, this list of conditions 
and
+       the following disclaimer in the documentation and/or other materials
+       provided with the distribution. Neither the name BernieCode nor
+       the names of its contributors may be used to endorse or promote products
+       derived from this software without specific prior written permission. 
+       
+       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 
IS"
+       AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
THE
+       IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
PURPOSE
+       ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 
FOR
+       ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+       DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
OR
+       SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
HOWEVER
+       CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+       LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY 
WAY
+       OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
SUCH
+       DAMAGE.
+
+*/
+
+
+// Applies a sequence of numbers between 0 and 1 to a number of subjects
+// construct - see setOptions for parameters
+function Animator(options) {
+       this.setOptions(options);
+       var _this = this;
+       this.timerDelegate = function(){_this.onTimerEvent()};
+       this.subjects = [];
+       this.target = 0;
+       this.state = 0;
+};
+Animator.prototype = {
+       // apply defaults
+       setOptions: function(options) {
+               this.options = Animator.applyDefaults({
+                       interval: 40,  // time between animation frames
+                       duration: 400, // length of animation
+                       onComplete: function(){},
+                       onStep: function(){},
+                       transition: Animator.tx.easeInOut
+               }, options);
+       },
+       // animate from the current state to provided value
+       seekTo: function(to) {
+               this.seekFromTo(this.state, to);
+       },
+       // animate from the current state to provided value
+       seekFromTo: function(from, to) {
+               this.target = Math.max(0, Math.min(1, to));
+               this.state = Math.max(0, Math.min(1, from));
+               if (!this.intervalId) {
+                       this.intervalId = 
window.setInterval(this.timerDelegate, this.options.interval);
+               }
+       },
+       // animate from the current state to provided value
+       jumpTo: function(to) {
+               this.target = this.state = Math.max(0, Math.min(1, to));
+               this.propagate();
+       },
+       // seek to the opposite of the current target
+       toggle: function() {
+               this.seekTo(1 - this.target);
+       },
+       // add a function or an object with a method setState(state) that will 
be called with a number
+       // between 0 and 1 on each frame of the animation
+       addSubject: function(subject) {
+               this.subjects[this.subjects.length] = subject;
+               return this;
+       },
+       // remove an object that was added with addSubject
+       removeSubject: function(subject) {
+               this.subjects = this.subjects.reject(function(item){return item 
== subject;});
+       },
+       // remove all subjects
+       clearSubjects: function() {
+               this.subjects = [];
+       },
+       // forward the current state to the animation subjects
+       propagate: function() {
+               var value = this.options.transition(this.state);
+               for (var i=0; i<this.subjects.length; i++) {
+                       if (this.subjects[i].setState) {
+                               this.subjects[i].setState(value);
+                       } else {
+                               this.subjects[i](value);
+                       }
+               }
+       },
+       // called once per frame to update the current state
+       onTimerEvent: function() {
+               
+               var movement = (this.options.interval / this.options.duration) 
* (this.state < this.target ? 1 : -1);
+               if (Math.abs(movement) >= Math.abs(this.state - this.target)) {
+                       this.state = this.target;
+               } else {
+                       this.state += movement;
+               }
+               
+               try {
+                       this.propagate();
+               } finally {
+                       this.options.onStep.call(this);
+                       if (this.target == this.state) {
+                               window.clearInterval(this.intervalId);
+                               this.intervalId = null;
+                               this.options.onComplete.call(this);
+                       }
+               }
+       },
+       // shortcuts
+       play: function() {this.seekFromTo(0, 1)},
+       reverse: function() {this.seekFromTo(1, 0)}
+}
+// merge the properties of two objects
+Animator.applyDefaults = function(defaults, prefs) {
+       prefs = prefs || {};
+       var prop, result = {};
+       for (prop in defaults) result[prop] = prefs[prop] !== undefined ? 
prefs[prop] : defaults[prop];
+       return result;
+}
+// make an array from any object
+Animator.makeArray = function(o) {
+       if (o == null) return [];
+       if (!o.length) return [o];
+       var result = [];
+       for (var i=0; i<o.length; i++) result[i] = o[i];
+       return result;
+}
+// convert a dash-delimited-property to a camelCaseProperty (c/o Prototype, 
thanks Sam!)
+Animator.camelize = function(string) {
+       var oStringList = string.split('-');
+       if (oStringList.length == 1) return oStringList[0];
+       
+       var camelizedString = string.indexOf('-') == 0
+               ? oStringList[0].charAt(0).toUpperCase() + 
oStringList[0].substring(1)
+               : oStringList[0];
+       
+       for (var i = 1, len = oStringList.length; i < len; i++) {
+               var s = oStringList[i];
+               camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
+       }
+       return camelizedString;
+}
+// syntactic sugar for creating CSSStyleSubjects
+Animator.apply = function(el, style, options) {
+       if (style instanceof Array) {
+               return new Animator(options).addSubject(new CSSStyleSubject(el, 
style[0], style[1]));
+       }
+       return new Animator(options).addSubject(new CSSStyleSubject(el, style));
+}
+// make a transition function that gradually accelerates. pass a=1 for smooth
+// gravitational acceleration, higher values for an exaggerated effect
+Animator.makeEaseIn = function(a) {
+       return function(state) {
+               return Math.pow(state, a*2); 
+       }
+}
+// as makeEaseIn but for deceleration
+Animator.makeEaseOut = function(a) {
+       return function(state) {
+               return 1 - Math.pow(1 - state, a*2); 
+       }
+}
+// make a transition function that, like an object with momentum being 
attracted to a point,
+// goes past the target then returns
+Animator.makeElastic = function(bounces) {
+       return function(state) {
+               state = Animator.tx.easeInOut(state);
+               return ((1-Math.cos(state * Math.PI * bounces)) * (1 - state)) 
+ state; 
+       }
+}
+// make an Attack Decay Sustain Release envelope that starts and finishes on 
the same level
+// 
+Animator.makeADSR = function(attackEnd, decayEnd, sustainEnd, sustainLevel) {
+       if (sustainLevel == null) sustainLevel = 0.5;
+       return function(state) {
+               if (state < attackEnd) {
+                       return state / attackEnd;
+               }
+               if (state < decayEnd) {
+                       return 1 - ((state - attackEnd) / (decayEnd - 
attackEnd) * (1 - sustainLevel));
+               }
+               if (state < sustainEnd) {
+                       return sustainLevel;
+               }
+               return sustainLevel * (1 - ((state - sustainEnd) / (1 - 
sustainEnd)));
+       }
+}
+// make a transition function that, like a ball falling to floor, reaches the 
target and/
+// bounces back again
+Animator.makeBounce = function(bounces) {
+       var fn = Animator.makeElastic(bounces);
+       return function(state) {
+               state = fn(state); 
+               return state <= 1 ? state : 2-state;
+       }
+}
+ 
+// pre-made transition functions to use with the 'transition' option
+Animator.tx = {
+       easeInOut: function(pos){
+               return ((-Math.cos(pos*Math.PI)/2) + 0.5);
+       },
+       linear: function(x) {
+               return x;
+       },
+       easeIn: Animator.makeEaseIn(1.5),
+       easeOut: Animator.makeEaseOut(1.5),
+       strongEaseIn: Animator.makeEaseIn(2.5),
+       strongEaseOut: Animator.makeEaseOut(2.5),
+       elastic: Animator.makeElastic(1),
+       veryElastic: Animator.makeElastic(3),
+       bouncy: Animator.makeBounce(1),
+       veryBouncy: Animator.makeBounce(3)
+}
+
+// animates a pixel-based style property between two integer values
+function NumericalStyleSubject(els, property, from, to, units) {
+       this.els = Animator.makeArray(els);
+       if (property == 'opacity' && window.ActiveXObject) {
+               this.property = 'filter';
+       } else {
+               this.property = Animator.camelize(property);
+       }
+       this.from = parseFloat(from);
+       this.to = parseFloat(to);
+       this.units = units != null ? units : 'px';
+}
+NumericalStyleSubject.prototype = {
+       setState: function(state) {
+               var style = this.getStyle(state);
+               var visibility = (this.property == 'opacity' && state == 0) ? 
'hidden' : '';
+               var j=0;
+               for (var i=0; i<this.els.length; i++) {
+                       try {
+                               this.els[i].style[this.property] = style;
+                       } catch (e) {
+                               if (this.property != 'fontWeight') throw e;
+                       }
+                       if (j++ > 20) return;
+               }
+       },
+       getStyle: function(state) {
+               state = this.from + ((this.to - this.from) * state);
+               if (this.property == 'filter') return "alpha(opacity=" + 
Math.round(state*100) + ")";
+               if (this.property == 'opacity') return state;
+               return Math.round(state) + this.units;
+       }
+}
+
+// animates a colour based style property between two hex values
+function ColorStyleSubject(els, property, from, to) {
+       this.els = Animator.makeArray(els);
+       this.property = Animator.camelize(property);
+       this.to = this.expandColor(to);
+       this.from = this.expandColor(from);
+}
+
+ColorStyleSubject.prototype = {
+       // parse "#FFFF00" to [256, 256, 0]
+       expandColor: function(color) {
+               var hexColor, red, green, blue;
+               hexColor = ColorStyleSubject.parseColor(color);
+               if (hexColor) {
+                       red = parseInt(hexColor.slice(1, 3), 16);
+                       green = parseInt(hexColor.slice(3, 5), 16);
+                       blue = parseInt(hexColor.slice(5, 7), 16);
+                       return [red,green,blue]
+               }
+               if (window.DEBUG) {
+                       alert("Invalid colour: '" + color + "'");
+               }
+       },
+       getValueForState: function(color, state) {
+               return Math.round(this.from[color] + ((this.to[color] - 
this.from[color]) * state));
+       },
+       setState: function(state) {
+               var color = '#'
+                               + 
ColorStyleSubject.toColorPart(this.getValueForState(0, state))
+                               + 
ColorStyleSubject.toColorPart(this.getValueForState(1, state))
+                               + 
ColorStyleSubject.toColorPart(this.getValueForState(2, state));
+               for (var i=0; i<this.els.length; i++) {
+                       this.els[i].style[this.property] = color;
+               }
+       }
+}
+
+// return a properly formatted 6-digit hex colour spec, or false
+ColorStyleSubject.parseColor = function(string) {
+       var color = '#', match;
+       if(match = ColorStyleSubject.parseColor.rgbRe.exec(string)) {
+               var part;
+               for (var i=1; i<=3; i++) {
+                       part = Math.max(0, Math.min(255, parseInt(match[i])));
+                       color += ColorStyleSubject.toColorPart(part);
+               }
+               return color;
+       }
+       if (match = ColorStyleSubject.parseColor.hexRe.exec(string)) {
+               if(match[1].length == 3) {
+                       for (var i=0; i<3; i++) {
+                               color += match[1].charAt(i) + 
match[1].charAt(i);
+                       }
+                       return color;
+               }
+               return '#' + match[1];
+       }
+       return false;
+}
+// convert a number to a 2 digit hex string
+ColorStyleSubject.toColorPart = function(number) {
+       if (number > 255) number = 255;
+       var digits = number.toString(16);
+       if (number < 16) return '0' + digits;
+       return digits;
+}
+ColorStyleSubject.parseColor.rgbRe = 
/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i;
+ColorStyleSubject.parseColor.hexRe = /^\#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
+
+// Animates discrete styles, i.e. ones that do not scale but have discrete 
values
+// that can't be interpolated
+function DiscreteStyleSubject(els, property, from, to, threshold) {
+       this.els = Animator.makeArray(els);
+       this.property = Animator.camelize(property);
+       this.from = from;
+       this.to = to;
+       this.threshold = threshold || 0.5;
+}
+
+DiscreteStyleSubject.prototype = {
+       setState: function(state) {
+               var j=0;
+               for (var i=0; i<this.els.length; i++) {
+                       this.els[i].style[this.property] = state <= 
this.threshold ? this.from : this.to; 
+               }
+       }
+}
+
+// animates between two styles defined using CSS.
+// if style1 and style2 are present, animate between them, if only style1
+// is present, animate between the element's current style and style1
+function CSSStyleSubject(els, style1, style2) {
+       els = Animator.makeArray(els);
+       this.subjects = [];
+       if (els.length == 0) return;
+       var prop, toStyle, fromStyle;
+       if (style2) {
+               fromStyle = this.parseStyle(style1, els[0]);
+               toStyle = this.parseStyle(style2, els[0]);
+       } else {
+               toStyle = this.parseStyle(style1, els[0]);
+               fromStyle = {};
+               for (prop in toStyle) {
+                       fromStyle[prop] = CSSStyleSubject.getStyle(els[0], 
prop);
+               }
+       }
+       // remove unchanging properties
+       var prop;
+       for (prop in fromStyle) {
+               if (fromStyle[prop] == toStyle[prop]) {
+                       delete fromStyle[prop];
+                       delete toStyle[prop];
+               }
+       }
+       // discover the type (numerical or colour) of each style
+       var prop, units, match, type;
+       for (prop in fromStyle) {
+               var fromProp = String(fromStyle[prop]);
+               var toProp = String(toStyle[prop]);
+               if (toStyle[prop] == null) {
+                       if (window.DEBUG) alert("No to style provided for '" + 
prop + '"');
+                       continue;
+               }
+               
+               if (from = ColorStyleSubject.parseColor(fromProp)) {
+                       to = ColorStyleSubject.parseColor(toProp);
+                       type = ColorStyleSubject;
+               } else if (fromProp.match(CSSStyleSubject.numericalRe)
+                               && toProp.match(CSSStyleSubject.numericalRe)) {
+                       from = parseFloat(fromProp);
+                       to = parseFloat(toProp);
+                       type = NumericalStyleSubject;
+                       match = CSSStyleSubject.numericalRe.exec(fromProp);
+                       var reResult = CSSStyleSubject.numericalRe.exec(toProp);
+                       if (match[1] != null) {
+                               units = match[1];
+                       } else if (reResult[1] != null) {
+                               units = reResult[1];
+                       } else {
+                               units = reResult;
+                       }
+               } else if (fromProp.match(CSSStyleSubject.discreteRe)
+                               && toProp.match(CSSStyleSubject.discreteRe)) {
+                       from = fromProp;
+                       to = toProp;
+                       type = DiscreteStyleSubject;
+                       units = 0;   // hack - how to get an animator option 
down to here
+               } else {
+                       if (window.DEBUG) {
+                               alert("Unrecognised format for value of "
+                                       + prop + ": '" + fromStyle[prop] + "'");
+                       }
+                       continue;
+               }
+               this.subjects[this.subjects.length] = new type(els, prop, from, 
to, units);
+       }
+}
+
+CSSStyleSubject.prototype = {
+       // parses "width: 400px; color: #FFBB2E" to {width: "400px", color: 
"#FFBB2E"}
+       parseStyle: function(style, el) {
+               var rtn = {};
+               // if style is a rule set
+               if (style.indexOf(":") != -1) {
+                       var styles = style.split(";");
+                       for (var i=0; i<styles.length; i++) {
+                               var parts = 
CSSStyleSubject.ruleRe.exec(styles[i]);
+                               if (parts) {
+                                       rtn[parts[1]] = parts[2];
+                               }
+                       }
+               }
+               // else assume style is a class name
+               else {
+                       var prop, value, oldClass;
+                       oldClass = el.className;
+                       el.className = style;
+                       for (var i=0; i<CSSStyleSubject.cssProperties.length; 
i++) {
+                               prop = CSSStyleSubject.cssProperties[i];
+                               value = CSSStyleSubject.getStyle(el, prop);
+                               if (value != null) {
+                                       rtn[prop] = value;
+                               }
+                       }
+                       el.className = oldClass;
+               }
+               return rtn;
+               
+       },
+       setState: function(state) {
+               for (var i=0; i<this.subjects.length; i++) {
+                       this.subjects[i].setState(state);
+               }
+       }
+}
+// get the current value of a css property, 
+CSSStyleSubject.getStyle = function(el, property){
+       var style;
+       if(document.defaultView && document.defaultView.getComputedStyle){
+               style = document.defaultView.getComputedStyle(el, 
"").getPropertyValue(property);
+               if (style) {
+                       return style;
+               }
+       }
+       property = Animator.camelize(property);
+       if(el.currentStyle){
+               style = el.currentStyle[property];
+       }
+       return style || el.style[property]
+}
+
+
+CSSStyleSubject.ruleRe = /^\s*([a-zA-Z\-]+)\s*:\s*(\S(.+\S)?)\s*$/;
+CSSStyleSubject.numericalRe = /^-?\d+(?:\.\d+)?(%|[a-zA-Z]{2})?$/;
+CSSStyleSubject.discreteRe = /^\w+$/;
+
+// required because the style object of elements isn't enumerable in Safari
+/*
+CSSStyleSubject.cssProperties = 
['background-color','border','border-color','border-spacing',
+'border-style','border-top','border-right','border-bottom','border-left','border-top-color',
+'border-right-color','border-bottom-color','border-left-color','border-top-width','border-right-width',
+'border-bottom-width','border-left-width','border-width','bottom','color','font-size','font-size-adjust',
+'font-stretch','font-style','height','left','letter-spacing','line-height','margin','margin-top',
+'margin-right','margin-bottom','margin-left','marker-offset','max-height','max-width','min-height',
+'min-width','orphans','outline','outline-color','outline-style','outline-width','overflow','padding',
+'padding-top','padding-right','padding-bottom','padding-left','quotes','right','size','text-indent',
+'top','width','word-spacing','z-index','opacity','outline-offset'];*/
+
+
+CSSStyleSubject.cssProperties = 
['azimuth','background','background-attachment','background-color','background-image','background-position','background-repeat','border-collapse','border-color','border-spacing','border-style','border-top','border-top-color','border-right-color','border-bottom-color','border-left-color','border-top-style','border-right-style','border-bottom-style','border-left-style','border-top-width','border-right-width','border-bottom-width','border-left-width','border-width','bottom','clear','clip','color','content','cursor','direction','display','elevation','empty-cells','css-float','font','font-family','font-size','font-size-adjust','font-stretch','font-style','font-variant','font-weight','height','left','letter-spacing','line-height','list-style','list-style-image','list-style-position','list-style-type','margin','margin-top','margin-right','margin-bottom','margin-left','max-height','max-width','min-height','min-width','orphans','outline','outline-color
 
','outline-style','outline-width','overflow','padding','padding-top','padding-right','padding-bottom','padding-left','pause','position','right','size','table-layout','text-align','text-decoration','text-indent','text-shadow','text-transform','top','vertical-align','visibility','white-space','width','word-spacing','z-index','opacity','outline-offset','overflow-x','overflow-y'];
+
+
+// chains several Animator objects together
+function AnimatorChain(animators, options) {
+       this.animators = animators;
+       this.setOptions(options);
+       for (var i=0; i<this.animators.length; i++) {
+               this.listenTo(this.animators[i]);
+       }
+       this.forwards = false;
+       this.current = 0;
+}
+
+AnimatorChain.prototype = {
+       // apply defaults
+       setOptions: function(options) {
+               this.options = Animator.applyDefaults({
+                       // by default, each call to AnimatorChain.play() calls 
jumpTo(0) of each animator
+                       // before playing, which can cause flickering if you 
have multiple animators all
+                       // targeting the same element. Set this to false to 
avoid this.
+                       resetOnPlay: true
+               }, options);
+       },
+       // play each animator in turn
+       play: function() {
+               this.forwards = true;
+               this.current = -1;
+               if (this.options.resetOnPlay) {
+                       for (var i=0; i<this.animators.length; i++) {
+                               this.animators[i].jumpTo(0);
+                       }
+               }
+               this.advance();
+       },
+       // play all animators backwards
+       reverse: function() {
+               this.forwards = false;
+               this.current = this.animators.length;
+               if (this.options.resetOnPlay) {
+                       for (var i=0; i<this.animators.length; i++) {
+                               this.animators[i].jumpTo(1);
+                       }
+               }
+               this.advance();
+       },
+       // if we have just play()'d, then call reverse(), and vice versa
+       toggle: function() {
+               if (this.forwards) {
+                       this.seekTo(0);
+               } else {
+                       this.seekTo(1);
+               }
+       },
+       // internal: install an event listener on an animator's onComplete 
option
+       // to trigger the next animator
+       listenTo: function(animator) {
+               var oldOnComplete = animator.options.onComplete;
+               var _this = this;
+               animator.options.onComplete = function() {
+                       if (oldOnComplete) oldOnComplete.call(animator);
+                       _this.advance();
+               }
+       },
+       // play the next animator
+       advance: function() {
+               if (this.forwards) {
+                       if (this.animators[this.current + 1] == null) return;
+                       this.current++;
+                       this.animators[this.current].play();
+               } else {
+                       if (this.animators[this.current - 1] == null) return;
+                       this.current--;
+                       this.animators[this.current].reverse();
+               }
+       },
+       // this function is provided for drop-in compatibility with Animator 
objects,
+       // but only accepts 0 and 1 as target values
+       seekTo: function(target) {
+               if (target <= 0) {
+                       this.forwards = false;
+                       this.animators[this.current].seekTo(0);
+               } else {
+                       this.forwards = true;
+                       this.animators[this.current].seekTo(1);
+               }
+       }
+}
+
+// an Accordion is a class that creates and controls a number of Animators. An 
array of elements is passed in,
+// and for each element an Animator and a activator button is created. When an 
Animator's activator button is
+// clicked, the Animator and all before it seek to 0, and all Animators after 
it seek to 1. This can be used to
+// create the classic Accordion effect, hence the name.
+// see setOptions for arguments
+function Accordion(options) {
+       this.setOptions(options);
+       var selected = this.options.initialSection, current;
+       if (this.options.rememberance) {
+               current = document.location.hash.substring(1);
+       }
+       this.rememberanceTexts = [];
+       this.ans = [];
+       var _this = this;
+       for (var i=0; i<this.options.sections.length; i++) {
+               var el = this.options.sections[i];
+               var an = new Animator(this.options.animatorOptions);
+               var from = this.options.from + (this.options.shift * i);
+               var to = this.options.to + (this.options.shift * i);
+               an.addSubject(new NumericalStyleSubject(el, 
this.options.property, from, to, this.options.units));
+               an.jumpTo(0);
+               var activator = this.options.getActivator(el);
+               activator.index = i;
+               activator.onclick = function(){_this.show(this.index)};
+               this.ans[this.ans.length] = an;
+               this.rememberanceTexts[i] = activator.innerHTML.replace(/\s/g, 
"");
+               if (this.rememberanceTexts[i] === current) {
+                       selected = i;
+               }
+       }
+       this.show(selected);
+}
+
+Accordion.prototype = {
+       // apply defaults
+       setOptions: function(options) {
+               this.options = Object.extend({
+                       // REQUIRED: an array of elements to use as the 
accordion sections
+                       sections: null,
+                       // a function that locates an activator button element 
given a section element.
+                       // by default it takes a button id from the section's 
"activator" attibute
+                       getActivator: function(el) {return 
$(el.getAttribute("activator"))},
+                       // shifts each animator's range, for example with 
options {from:0,to:100,shift:20}
+                       // the animators' ranges will be 0-100, 20-120, 40-140 
etc.
+                       shift: 0,
+                       // the first page to show
+                       initialSection: 0,
+                       // if set to true, document.location.hash will be used 
to preserve the open section across page reloads 
+                       rememberance: true,
+                       // constructor arguments to the Animator objects
+                       animatorOptions: {}
+               }, options || {});
+       },
+       show: function(section) {
+               for (var i=0; i<this.ans.length; i++) {
+                       this.ans[i].seekTo(i > section ? 1 : 0);
+               }
+               if (this.options.rememberance) {
+                       document.location.hash = 
this.rememberanceTexts[section];
+               }
+       }
+}

Propchange: incubator/wicket/sandbox/dashorst/animation/animator.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/wicket/sandbox/dashorst/animation/apache.png
URL: 
http://svn.apache.org/viewvc/incubator/wicket/sandbox/dashorst/animation/apache.png?view=auto&rev=529073
==============================================================================
Binary file - no diff available.

Propchange: incubator/wicket/sandbox/dashorst/animation/apache.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: incubator/wicket/sandbox/dashorst/animation/apache2.png
URL: 
http://svn.apache.org/viewvc/incubator/wicket/sandbox/dashorst/animation/apache2.png?view=auto&rev=529073
==============================================================================
Binary file - no diff available.

Propchange: incubator/wicket/sandbox/dashorst/animation/apache2.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: incubator/wicket/sandbox/dashorst/animation/common.js
URL: 
http://svn.apache.org/viewvc/incubator/wicket/sandbox/dashorst/animation/common.js?view=auto&rev=529073
==============================================================================
--- incubator/wicket/sandbox/dashorst/animation/common.js (added)
+++ incubator/wicket/sandbox/dashorst/animation/common.js Sun Apr 15 14:21:42 
2007
@@ -0,0 +1,31 @@
+function getWidth() {
+       if (self.innerWidth)
+       {
+               frameWidth = self.innerWidth;
+       }
+       else if (document.documentElement && 
document.documentElement.clientWidth)
+       {
+               frameWidth = document.documentElement.clientWidth;
+       }
+       else if (document.body)
+       {
+               frameWidth = document.body.clientWidth;
+       }
+       return frameWidth;
+}
+function getHeight() {
+       if (self.innerWidth)
+       {
+               frameHeight = self.innerHeight;
+       }
+       else if (document.documentElement && 
document.documentElement.clientWidth)
+       {
+               frameHeight = document.documentElement.clientHeight;
+       }
+       else if (document.body)
+       {
+               frameHeight = document.body.clientHeight;
+       }
+       return frameHeight;
+}
+

Propchange: incubator/wicket/sandbox/dashorst/animation/common.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/wicket/sandbox/dashorst/animation/incubating.png
URL: 
http://svn.apache.org/viewvc/incubator/wicket/sandbox/dashorst/animation/incubating.png?view=auto&rev=529073
==============================================================================
Binary file - no diff available.

Propchange: incubator/wicket/sandbox/dashorst/animation/incubating.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: incubator/wicket/sandbox/dashorst/animation/index.html
URL: 
http://svn.apache.org/viewvc/incubator/wicket/sandbox/dashorst/animation/index.html?view=auto&rev=529073
==============================================================================
--- incubator/wicket/sandbox/dashorst/animation/index.html (added)
+++ incubator/wicket/sandbox/dashorst/animation/index.html Sun Apr 15 14:21:42 
2007
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+       "http://www.w3.org/TR/html4/loose.dtd";>
+<html>
+<head>
+       <title>Apache Wicket</title>
+       <script type="text/javascript" src="animator.js"></script>
+       <script type="text/javascript" src="common.js"></script>
+       <script type="text/javascript">
+       function appear(id, duration) {
+               var anim = new Animator({ duration : duration });
+               anim.addSubject(new 
NumericalStyleSubject(document.getElementById(id), 'opacity', 0, 1));
+               anim.play();
+       }
+
+       function animateApacheWicket() {
+               var logo = document.getElementById('top');
+               
+               var apache = document.getElementById('apache');
+               apache.style.top = getHeight() / 2 - apache.height / 2 + 'px';
+               apache.style.left = (getWidth() / 2 - (logo.width / 2) - 
apache.width - 50) + 'px';
+
+               var wicket = document.getElementById('wicket');
+               wicket.style.top = getHeight() / 2 - wicket.height / 2 + 'px';
+               wicket.style.left = (getWidth() / 2 + logo.width / 2 + 50) + 
'px';
+
+               appear('apache', 1500);
+               appear('wicket', 1500);
+       }
+
+       function moveLogo() {
+               document.getElementById('top').style.display = 'block';
+               document.getElementById('bottom').style.display = 'block';
+
+               var interval = 40;
+               var duration = 2000;
+               if(/KHTML/.test(navigator.userAgent) && 
/Apple/.test(navigator.userAgent)) {
+                       interval = 80;
+                       duration = 600;
+               }
+               var bounce = new Animator({
+                   transition: Animator.makeBounce(2.5),
+                       interval: interval,  // time between animation frames
+                   duration: duration
+               });
+               bounce.addSubject(new 
NumericalStyleSubject(document.getElementById('top'), 'margin-top', 0, 
getHeight() / 2 - 120));
+               bounce.addSubject(new 
NumericalStyleSubject(document.getElementById('bottom'), 'margin-top', 
getHeight() - 430, 0))
+
+               var slide = new Animator({
+                   transition: Animator.makeEaseOut(1.5),
+                       interval: interval,  // time between animation frames
+                   duration: duration,
+                       onComplete : function() {
+                                       animateApacheWicket();
+                                       appear('introduction', duration);
+                                       appear('download', duration);
+                               }
+               });
+               slide.addSubject(new 
NumericalStyleSubject(document.getElementById('logo'), 'margin-left', -300, 
getWidth() / 2 - 120))
+               
+               bounce.play();
+               slide.play();
+       }
+       </script>
+       <link href="style.css" rel="stylesheet" />
+</head>
+<body onload="moveLogo();">
+       <a href="http://incubator.apache.org/wicket"; class="barelink">
+       <div id="logo">
+               <img id="apache" style="opacity:0;z-index:1;position:absolute" 
src="apache.png" />
+               <img id="wicket" style="opacity:0;z-index:1;position:absolute" 
src="wicket.png" />
+               <img id="top"    style="display:none" src="logo-top.png" />
+               <img id="bottom" style="display:none" src="logo-bottom2.png" />
+       </div>
+       </a>
+       <div id="introduction">
+               <a id="incubating" 
href="http://incubator.apache.org/projects/wicket"; class="barelink"><img 
src="incubating.png"/></a>
+               <p>Apache Wicket is a <strong>component oriented</strong>, Java 
web application framework that takes <strong>simplicity</strong>, 
<strong>separation of concerns</strong> and <strong>ease of 
development</strong> to a whole new level. Wicket pages can be mocked up, 
previewed and later revised using standard WYSIWYG HTML design tools. Dynamic 
content processing and form handling is all handled in Java code using a 
first-class component model.</p>
+       </div>
+       <div id="download" >
+               <h4>Get started</h4>
+               <ul>
+               <li class="first">Download <a 
href="http://sourceforge.net/project/showfiles.php?group_id=119783";>wicket-1.2.5</a>
 from SourceForge</li>
+               <li>See some <a 
href="http://incubator.apache.org/wicket/examples.html";>examples</a> or browse 
them <a href="http://wicketstuff.org/wicket13";>live</a></li>
+               <li>Start developing immediately with <a 
href="http://wicketframework.org/wicket-quickstart/index.html";>quick 
start</a></li>
+               </ul>
+               <h4>Get help</h4>
+               <ul>
+               <li class="first">Read our <a 
href="http://wicketframework.org/wiki";>wiki</a></li>
+               <li>Search or browse our <a 
href="http://www.nabble.com/Wicket-f13974.html";>mailinglists</a></li>
+               <li>Ask a question on our <a 
href="http://www.nabble.com/Wicket---User-f13976.html";>user list</a> or on our 
<a href="http://incubator.apache.org/wicket/community.html#Community-irc";>IRC 
channel</a></li>
+               </p>
+       </div>
+       <div id="footer">
+               <p id="licenseText">Apache Wicket is distributed under the <a 
href="http://www.apache.org/licenses/LICENSE-2.0.html";>Apache 2 license</a>.</p>
+       </div>
+</body>
+</html>

Propchange: incubator/wicket/sandbox/dashorst/animation/index.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/wicket/sandbox/dashorst/animation/logo-bottom.png
URL: 
http://svn.apache.org/viewvc/incubator/wicket/sandbox/dashorst/animation/logo-bottom.png?view=auto&rev=529073
==============================================================================
Binary file - no diff available.

Propchange: incubator/wicket/sandbox/dashorst/animation/logo-bottom.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: incubator/wicket/sandbox/dashorst/animation/logo-bottom2.png
URL: 
http://svn.apache.org/viewvc/incubator/wicket/sandbox/dashorst/animation/logo-bottom2.png?view=auto&rev=529073
==============================================================================
Binary file - no diff available.

Propchange: incubator/wicket/sandbox/dashorst/animation/logo-bottom2.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: incubator/wicket/sandbox/dashorst/animation/logo-top.png
URL: 
http://svn.apache.org/viewvc/incubator/wicket/sandbox/dashorst/animation/logo-top.png?view=auto&rev=529073
==============================================================================
Binary file - no diff available.

Propchange: incubator/wicket/sandbox/dashorst/animation/logo-top.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: incubator/wicket/sandbox/dashorst/animation/style.css
URL: 
http://svn.apache.org/viewvc/incubator/wicket/sandbox/dashorst/animation/style.css?view=auto&rev=529073
==============================================================================
--- incubator/wicket/sandbox/dashorst/animation/style.css (added)
+++ incubator/wicket/sandbox/dashorst/animation/style.css Sun Apr 15 14:21:42 
2007
@@ -0,0 +1,51 @@
+body { font-family : 'gill sans', 'helvetica'; font-size : 10pt; overflow : 
hidden;}
+strong { color : #E9611C;}
+#logo { width:240px; margin-left : -300px; margin-right: auto;}
+#top, #bottom { }
+#bottom { margin-top : 300px;}
+#footer { position : fixed; bottom : 0px; width: 100%; height : 100px; 
text-align:center;}
+.barelink div, .barelink img { border : none;}
+a, a:link, a:visited, a:active, a:hover { color:#E9611C; 
font-weight:bold;text-decoration:none;}
+
+#download, #introduction {
+       opacity:0;
+       position:absolute;
+       top:100px;
+       width:350px;
+}
+#download {
+       right:0px;
+       margin-right:50px;
+       text-align:center;
+}
+#introduction {
+       top:100px;
+       left:50px;
+}
+#incubating {
+       display:block;
+       float:right;
+}
+ul {
+       margin: 0;
+       padding: 0;
+       list-style: none;
+       margin-left: 0;
+       padding-left: 1em;
+       text-indent: -1em;
+       margin-bottom:1em;
+       }
+li {
+       display: inline;
+       margin: 0;
+       padding: 0;
+}
+ul li:before {
+       content: "\00B7 \0020";
+       }
+
+ul li.first:before {
+       content: " ";
+       }
+
+h4 { margin:0;padding:0;text-align:center;}
\ No newline at end of file

Propchange: incubator/wicket/sandbox/dashorst/animation/style.css
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/wicket/sandbox/dashorst/animation/wicket-logo.png
URL: 
http://svn.apache.org/viewvc/incubator/wicket/sandbox/dashorst/animation/wicket-logo.png?view=auto&rev=529073
==============================================================================
Binary file - no diff available.

Propchange: incubator/wicket/sandbox/dashorst/animation/wicket-logo.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: incubator/wicket/sandbox/dashorst/animation/wicket.png
URL: 
http://svn.apache.org/viewvc/incubator/wicket/sandbox/dashorst/animation/wicket.png?view=auto&rev=529073
==============================================================================
Binary file - no diff available.

Propchange: incubator/wicket/sandbox/dashorst/animation/wicket.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: incubator/wicket/sandbox/dashorst/animation/wicket2.png
URL: 
http://svn.apache.org/viewvc/incubator/wicket/sandbox/dashorst/animation/wicket2.png?view=auto&rev=529073
==============================================================================
Binary file - no diff available.

Propchange: incubator/wicket/sandbox/dashorst/animation/wicket2.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: incubator/wicket/sandbox/dashorst/animation/yahoo.html
URL: 
http://svn.apache.org/viewvc/incubator/wicket/sandbox/dashorst/animation/yahoo.html?view=auto&rev=529073
==============================================================================
--- incubator/wicket/sandbox/dashorst/animation/yahoo.html (added)
+++ incubator/wicket/sandbox/dashorst/animation/yahoo.html Sun Apr 15 14:21:42 
2007
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+       "http://www.w3.org/TR/html4/loose.dtd";>
+<html>
+<head>
+       <title>Apache Wicket</title>
+
+       <script 
src="http://yui.yahooapis.com/2.2.1/build/yahoo-dom-event/yahoo-dom-event.js";></script>
+       <script 
src="http://yui.yahooapis.com/2.2.1/build/animation/animation-min.js";></script>
+
+       <script src="common.js"></script>
+
+       <script type="text/javascript">
+       function appear(id, duration) {
+               var anim = new YAHOO.util.Anim(id, { opacity: { from: 0.0, to: 
1.0 } }, duration, YAHOO.util.Easing.easeOut);
+               anim.animate();
+       }
+
+       function animateApacheWicket() {
+               var logo = document.getElementById('top');
+               
+               var apache = document.getElementById('apache');
+               apache.style.top = getHeight() / 2 - apache.height / 2 + 'px';
+               apache.style.left = (getWidth() / 2 - (logo.width / 2) - 
apache.width - 50) + 'px';
+
+               var wicket = document.getElementById('wicket');
+               wicket.style.top = getHeight() / 2 - wicket.height / 2 + 'px';
+               wicket.style.left = (getWidth() / 2 + logo.width / 2 + 50) + 
'px';
+
+               appear('apache', 1.5);
+               appear('wicket', 1.5);
+       }
+       function moveLogo() {
+               document.getElementById('top').style.display = 'block';
+               document.getElementById('bottom').style.display = 'block';
+
+               var duration = 1.0;
+
+               var animLogo = new YAHOO.util.Anim('logo', { 'margin-left' : { 
from:0, to: getWidth() / 2 -120 }}, 2, YAHOO.util.Easing.easeOutStrong);
+               animLogo.onComplete.subscribe(function() {
+                       animateApacheWicket();
+                       appear('introduction', duration);
+                       appear('download', duration);
+                       setTimeout('quote();', 3000);
+               });
+               
+               animLogo.animate();
+
+               var animTop = new YAHOO.util.Anim('top', { 'margin-top' : { 
from:0, to: (getHeight() / 2 - 120) }}, 2, YAHOO.util.Easing.bounceOut);
+               var animBottom = new YAHOO.util.Anim('bottom', { 'margin-top' : 
{ from:(getHeight() - 430), to: 0 }}, 2, YAHOO.util.Easing.bounceOut);
+               animTop.animate();
+               animBottom.animate();
+       }
+
+       YAHOO.util.Event.onAvailable('logo', moveLogo);
+       </script>
+       <link href="style.css" rel="stylesheet" />
+</head>
+<body>
+       <a href="http://incubator.apache.org/wicket"; class="barelink">
+       <div id="logo">
+               <img id="apache" style="opacity:0;z-index:1;position:absolute" 
src="apache.png" />
+               <img id="wicket" style="opacity:0;z-index:1;position:absolute" 
src="wicket.png" />
+               <img id="top"    style="display:none" src="logo-top.png" />
+               <img id="bottom" style="display:none" src="logo-bottom2.png" />
+       </div>
+       </a>
+       <div id="introduction">
+               <a id="incubating" 
href="http://incubator.apache.org/projects/wicket"; class="barelink"><img 
src="incubating.png"/></a>
+               <p>Apache Wicket is a <strong>component oriented</strong>, Java 
web application framework that takes <strong>simplicity</strong>, 
<strong>separation of concerns</strong> and <strong>ease of 
development</strong> to a whole new level. Wicket pages can be mocked up, 
previewed and later revised using standard WYSIWYG HTML design tools. Dynamic 
content processing and form handling is all handled in Java code using a 
first-class component model.</p>
+       </div>
+       <div id="download" >
+               <h4>Get started</h4>
+               <ul>
+               <li class="first">Download <a 
href="http://sourceforge.net/project/showfiles.php?group_id=119783";>wicket-1.2.5</a>
 from SourceForge</li>
+               <li>See some <a 
href="http://incubator.apache.org/wicket/examples.html";>examples</a> or browse 
them <a href="http://wicketstuff.org/wicket13";>live</a></li>
+               <li>Start developing immediately with <a 
href="http://wicketframework.org/wicket-quickstart/index.html";>quick 
start</a></li>
+               </ul>
+               <h4>Get help</h4>
+               <ul>
+               <li class="first">Read our <a 
href="http://wicketframework.org/wiki";>wiki</a></li>
+               <li>Search or browse our <a 
href="http://www.nabble.com/Wicket-f13974.html";>mailinglists</a></li>
+               <li>Ask a question on our <a 
href="http://www.nabble.com/Wicket---User-f13976.html";>user list</a> or on our 
<a href="http://incubator.apache.org/wicket/community.html#Community-irc";>IRC 
channel</a></li>
+               </p>
+       </div>
+       <div id="footer">
+               <p id="licenseText">Apache Wicket is distributed under the <a 
href="http://www.apache.org/licenses/LICENSE-2.0.html";>Apache 2 license</a>.</p>
+       </div>
+</body>
+</html>

Propchange: incubator/wicket/sandbox/dashorst/animation/yahoo.html
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to