// Spry.Effect.js - version 0.38 - Spry Pre-Release 1.6
|
//
|
// Copyright (c) 2006. Adobe Systems Incorporated.
|
// 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 of Adobe Systems Incorporated 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 COPYRIGHT OWNER 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.
|
|
var Spry;
|
|
if (!Spry) Spry = {};
|
|
Spry.forwards = 1; // const
|
Spry.backwards = 2; // const
|
|
if (!Spry.Effect) Spry.Effect = {};
|
|
Spry.Effect.Transitions = {
|
linearTransition: function(time, begin, change, duration)
|
{
|
if (time > duration) return change+begin;
|
return begin + (time / duration) * change;
|
},
|
sinusoidalTransition: function(time, begin, change, duration)
|
{
|
if (time > duration) return change+begin;
|
return begin + ((-Math.cos((time/duration)*Math.PI)/2) + 0.5) * change;
|
},
|
squareTransition: function(time, begin, change, duration)
|
{
|
if (time > duration) return change+begin;
|
return begin + Math.pow(time/duration, 2) * change;
|
},
|
squarerootTransition: function(time, begin, change, duration)
|
{
|
if (time > duration) return change+begin;
|
return begin + Math.sqrt(time/duration) * change;
|
},
|
fifthTransition: function(time, begin, change, duration)
|
{
|
if (time > duration) return change+begin;
|
return begin + Math.sqrt((-Math.cos((time/duration)*Math.PI)/2) + 0.5) * change;
|
},
|
circleTransition: function(time, begin, change, duration)
|
{
|
if (time > duration) return change+begin;
|
var pos = time/duration;
|
return begin + Math.sqrt(1 - Math.pow((pos-1), 2))* change;
|
},
|
pulsateTransition: function(time, begin, change, duration)
|
{
|
if (time > duration) return change+begin;
|
return begin + (0.5 + Math.sin(17*time/duration)/2) * change;
|
},
|
growSpecificTransition: function(time, begin, change, duration)
|
{
|
if (time > duration) return change+begin;
|
var pos = time/duration;
|
return begin + (5 * Math.pow(pos, 3) - 6.4 * Math.pow(pos, 2) + 2 * pos) * change;
|
}
|
};
|
for (var trans in Spry.Effect.Transitions)
|
{
|
Spry[trans] = Spry.Effect.Transitions[trans];
|
}
|
//////////////////////////////////////////////////////////////////////
|
//
|
// Spry.Effect.Registry
|
//
|
//////////////////////////////////////////////////////////////////////
|
|
Spry.Effect.Registry = function()
|
{
|
this.effects = [];
|
};
|
|
Spry.Effect.Registry.prototype.getRegisteredEffect = function(element, options)
|
{
|
var a = {};
|
a.element = Spry.Effect.getElement(element);
|
a.options = options;
|
|
for (var i=0; i<this.effects.length; i++)
|
if (this.effectsAreTheSame(this.effects[i], a))
|
return this.effects[i].effect;
|
|
return false;
|
};
|
|
Spry.Effect.Registry.prototype.addEffect = function(effect, element, options)
|
{
|
if (!this.getRegisteredEffect(element, options))
|
{
|
var len = this.effects.length;
|
this.effects[len] = {};
|
var eff = this.effects[len];
|
eff.effect = effect;
|
eff.element = Spry.Effect.getElement(element);
|
eff.options = options;
|
}
|
};
|
|
Spry.Effect.Registry.prototype.effectsAreTheSame = function(effectA, effectB)
|
{
|
if (effectA.element != effectB.element)
|
return false;
|
|
var compare = Spry.Effect.Utils.optionsAreIdentical(effectA.options, effectB.options);
|
// reset finish and setup functions
|
if (compare)
|
{
|
if (typeof effectB.options.setup == 'function')
|
effectA.options.setup = effectB.options.setup;
|
|
if (typeof effectB.options.finish == 'function')
|
effectA.options.finish = effectB.options.finish;
|
}
|
|
return compare;
|
};
|
|
var SpryRegistry = new Spry.Effect.Registry;
|
|
//////////////////////////////////////////////////////////////////////
|
//
|
// Spry.Effect.Utils
|
//
|
//////////////////////////////////////////////////////////////////////
|
|
if (!Spry.Effect.Utils) Spry.Effect.Utils = {};
|
|
Spry.Effect.Utils.showError = function(msg)
|
{
|
alert('Spry.Effect ERR: ' + msg);
|
};
|
Spry.Effect.Utils.showInitError = function(effect){
|
Spry.Effect.Utils.showError('The ' + effect + ' class can\'t be accessed as a static function anymore. '+ "\n" + 'Please read Spry Effects migration documentation.');
|
return false;
|
};
|
Spry.Effect.Utils.Position = function()
|
{
|
this.x = 0; // left
|
this.y = 0; // top
|
this.units = "px";
|
};
|
|
Spry.Effect.Utils.Rectangle = function()
|
{
|
this.width = 0;
|
this.height = 0;
|
this.units = "px";
|
};
|
|
Spry.Effect.Utils.intToHex = function(integerNum)
|
{
|
var result = integerNum.toString(16);
|
if (result.length == 1)
|
result = "0" + result;
|
return result;
|
};
|
|
Spry.Effect.Utils.hexToInt = function(hexStr)
|
{
|
return parseInt(hexStr, 16);
|
};
|
|
Spry.Effect.Utils.rgb = function(redInt, greenInt, blueInt)
|
{
|
var intToHex = Spry.Effect.Utils.intToHex;
|
var redHex = intToHex(redInt);
|
var greenHex = intToHex(greenInt);
|
var blueHex = intToHex(blueInt);
|
compositeColorHex = redHex.concat(greenHex, blueHex).toUpperCase();
|
compositeColorHex = '#' + compositeColorHex;
|
return compositeColorHex;
|
};
|
|
Spry.Effect.Utils.longColorVersion = function(color){
|
if ( color.match(/^#[0-9a-f]{3}$/i) ){
|
var tmp = color.split('');
|
var color = '#';
|
for (var i = 1; i < tmp.length; i++){
|
color += tmp[i] + '' + tmp[i];
|
}
|
}
|
return color;
|
};
|
|
Spry.Effect.Utils.camelize = function(stringToCamelize)
|
{
|
if (stringToCamelize.indexOf('-') == -1){
|
return stringToCamelize;
|
}
|
var oStringList = stringToCamelize.split('-');
|
var isFirstEntry = true;
|
var camelizedString = '';
|
|
for(var i=0; i < oStringList.length; i++)
|
{
|
if(oStringList[i].length>0)
|
{
|
if(isFirstEntry)
|
{
|
camelizedString = oStringList[i];
|
isFirstEntry = false;
|
}
|
else
|
{
|
var s = oStringList[i];
|
camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
|
}
|
}
|
}
|
|
return camelizedString;
|
};
|
|
Spry.Effect.Utils.isPercentValue = function(value)
|
{
|
var result = false;
|
if (typeof value == 'string' && value.length > 0 && value.lastIndexOf("%") > 0)
|
result = true;
|
|
return result;
|
};
|
|
Spry.Effect.Utils.getPercentValue = function(value)
|
{
|
var result = 0;
|
try
|
{
|
result = Number(value.substring(0, value.lastIndexOf("%")));
|
}
|
catch (e) {Spry.Effect.Utils.showError('Spry.Effect.Utils.getPercentValue: ' + e);}
|
return result;
|
};
|
|
Spry.Effect.Utils.getPixelValue = function(value)
|
{
|
var result = 0;
|
if (typeof value == 'number') return value;
|
var unitIndex = value.lastIndexOf("px");
|
if ( unitIndex == -1)
|
unitIndex = value.length;
|
try
|
{
|
result = parseInt(value.substring(0, unitIndex), 10);
|
}
|
catch (e){}
|
return result;
|
};
|
|
Spry.Effect.Utils.getFirstChildElement = function(node)
|
{
|
if (node)
|
{
|
var childCurr = node.firstChild;
|
while (childCurr)
|
{
|
if (childCurr.nodeType == 1) // Node.ELEMENT_NODE
|
return childCurr;
|
|
childCurr = childCurr.nextSibling;
|
}
|
}
|
|
return null;
|
};
|
|
Spry.Effect.Utils.fetchChildImages = function(startEltIn, targetImagesOut)
|
{
|
if(!startEltIn || startEltIn.nodeType != 1 || !targetImagesOut)
|
return;
|
|
if(startEltIn.hasChildNodes())
|
{
|
var childImages = startEltIn.getElementsByTagName('img');
|
var imageCnt = childImages.length;
|
for(var i=0; i<imageCnt; i++)
|
{
|
var imgCurr = childImages[i];
|
var dimensionsCurr = Spry.Effect.getDimensions(imgCurr);
|
targetImagesOut.push([imgCurr,dimensionsCurr.width,dimensionsCurr.height]);
|
}
|
}
|
};
|
|
Spry.Effect.Utils.optionsAreIdentical = function(optionsA, optionsB)
|
{
|
if(optionsA == null && optionsB == null)
|
return true;
|
|
if(optionsA != null && optionsB != null)
|
{
|
var objectCountA = 0;
|
var objectCountB = 0;
|
|
for (var propA in optionsA) objectCountA++;
|
for (var propB in optionsB) objectCountB++;
|
|
if(objectCountA != objectCountB)
|
return false;
|
|
for (var prop in optionsA)
|
{
|
var typeA = typeof optionsA[prop];
|
var typeB = typeof optionsB[prop];
|
if ( typeA != typeB || (typeA != 'undefined' && optionsA[prop] != optionsB[prop]))
|
return false;
|
}
|
|
return true;
|
}
|
|
return false;
|
};
|
|
Spry.Effect.Utils.DoEffect = function (effectName, element, options)
|
{
|
if (!options)
|
var options = {};
|
|
options.name = effectName;
|
var ef = SpryRegistry.getRegisteredEffect(element, options);
|
if (!ef)
|
{
|
ef = new Spry.Effect[effectName](element, options);
|
SpryRegistry.addEffect(ef, element, options);
|
}
|
ef.start();
|
return true;
|
};
|
//////////////////////////////////////////////////////////////////////
|
//
|
// The notification class
|
//
|
//////////////////////////////////////////////////////////////////////
|
if (!Spry.Utils) Spry.Utils = {};
|
|
Spry.Utils.Notifier = function()
|
{
|
this.observers = [];
|
this.suppressNotifications = 0;
|
};
|
|
Spry.Utils.Notifier.prototype.addObserver = function(observer)
|
{
|
if (!observer)
|
return;
|
|
// Make sure the observer isn't already on the list.
|
|
var len = this.observers.length;
|
for (var i = 0; i < len; i++)
|
if (this.observers[i] == observer) return;
|
|
this.observers[len] = observer;
|
};
|
|
Spry.Utils.Notifier.prototype.removeObserver = function(observer)
|
{
|
if (!observer)
|
return;
|
|
for (var i = 0; i < this.observers.length; i++)
|
{
|
if (this.observers[i] == observer)
|
{
|
this.observers.splice(i, 1);
|
break;
|
}
|
}
|
};
|
|
Spry.Utils.Notifier.prototype.notifyObservers = function(methodName, data)
|
{
|
if (!methodName)
|
return;
|
|
if (!this.suppressNotifications)
|
{
|
var len = this.observers.length;
|
for (var i = 0; i < len; i++)
|
{
|
var obs = this.observers[i];
|
if (obs)
|
{
|
if (typeof obs == "function")
|
obs(methodName, this, data);
|
else if (obs[methodName])
|
obs[methodName](this, data);
|
}
|
}
|
}
|
};
|
|
Spry.Utils.Notifier.prototype.enableNotifications = function()
|
{
|
if (--this.suppressNotifications < 0)
|
{
|
this.suppressNotifications = 0;
|
Spry.Effect.Utils.showError("Unbalanced enableNotifications() call!\n");
|
}
|
};
|
|
Spry.Utils.Notifier.prototype.disableNotifications = function()
|
{
|
++this.suppressNotifications;
|
};
|
|
//////////////////////////////////////////////////////////////////////
|
//
|
// DHTML manipulation
|
//
|
//////////////////////////////////////////////////////////////////////
|
|
Spry.Effect.getElement = function(ele)
|
{
|
var element = ele;
|
if (typeof ele == "string")
|
element = document.getElementById(ele);
|
|
if (element == null)
|
Spry.Effect.Utils.showError('Element "' + ele + '" not found.');
|
|
return element;
|
};
|
|
Spry.Effect.getStyleProp = function(element, prop)
|
{
|
var value;
|
var camelized = Spry.Effect.Utils.camelize(prop);
|
try
|
{
|
if (element.style)
|
value = element.style[camelized];
|
|
if (!value)
|
{
|
if (document.defaultView && document.defaultView.getComputedStyle)
|
{
|
var css = document.defaultView.getComputedStyle(element, null);
|
value = css ? css.getPropertyValue(prop) : null;
|
}
|
else if (element.currentStyle)
|
{
|
value = element.currentStyle[camelized];
|
}
|
}
|
}
|
catch (e) {Spry.Effect.Utils.showError('Spry.Effect.getStyleProp: ' + e);}
|
|
return value == 'auto' ? null : value;
|
};
|
|
Spry.Effect.setStyleProp = function(element, prop, value)
|
{
|
try
|
{
|
element.style[Spry.Effect.Utils.camelize(prop)] = value;
|
}
|
catch (e) {Spry.Effect.Utils.showError('Spry.Effect.setStyleProp: ' + e);}
|
};
|
|
Spry.Effect.getStylePropRegardlessOfDisplayState = function(element, prop, displayElement)
|
{
|
var refElement = displayElement ? displayElement : element;
|
var displayOrig = Spry.Effect.getStyleProp(refElement, 'display');
|
var visibilityOrig = Spry.Effect.getStyleProp(refElement, 'visibility');
|
|
if(displayOrig == 'none')
|
{
|
Spry.Effect.setStyleProp(refElement, 'visibility', 'hidden');
|
Spry.Effect.setStyleProp(refElement, 'display', 'block');
|
|
if(window.opera) // opera needs focus to calculate the size for hidden elements
|
refElement.focus();
|
}
|
|
var styleProp = Spry.Effect.getStyleProp(element, prop);
|
|
if(displayOrig == 'none') // reset the original values
|
{
|
Spry.Effect.setStyleProp(refElement, 'display', 'none');
|
Spry.Effect.setStyleProp(refElement, 'visibility', visibilityOrig);
|
}
|
return styleProp;
|
};
|
|
Spry.Effect.makePositioned = function(element)
|
{
|
var pos = Spry.Effect.getStyleProp(element, 'position');
|
if (!pos || pos == 'static')
|
{
|
element.style.position = 'relative';
|
|
// Opera returns the offset relative to the positioning context, when an
|
// element is position relative but top and left have not been defined
|
if (window.opera)
|
{
|
element.style.top = 0;
|
element.style.left = 0;
|
}
|
}
|
};
|
|
Spry.Effect.isInvisible = function(element)
|
{
|
var propDisplay = Spry.Effect.getStyleProp(element, 'display');
|
if (propDisplay && propDisplay.toLowerCase() == 'none')
|
return true;
|
|
var propVisible = Spry.Effect.getStyleProp(element, 'visibility');
|
if (propVisible && propVisible.toLowerCase() == 'hidden')
|
return true;
|
|
return false;
|
};
|
|
Spry.Effect.enforceVisible = function(element)
|
{
|
var propDisplay = Spry.Effect.getStyleProp(element, 'display');
|
if (propDisplay && propDisplay.toLowerCase() == 'none')
|
Spry.Effect.setStyleProp(element, 'display', 'block');
|
|
var propVisible = Spry.Effect.getStyleProp(element, 'visibility');
|
if (propVisible && propVisible.toLowerCase() == 'hidden')
|
Spry.Effect.setStyleProp(element, 'visibility', 'visible');
|
};
|
|
Spry.Effect.makeClipping = function(element)
|
{
|
var overflow = Spry.Effect.getStyleProp(element, 'overflow');
|
if (!overflow || (overflow.toLowerCase() != 'hidden' && overflow.toLowerCase() != 'scroll'))
|
{
|
// IE 7 bug: set overflow property to hidden changes the element height to 0
|
// -> therefore we save the height before changing the overflow property and set the old size back
|
var heightCache = 0;
|
var needsCache = /MSIE 7.0/.test(navigator.userAgent) && /Windows NT/.test(navigator.userAgent);
|
if(needsCache)
|
heightCache = Spry.Effect.getDimensionsRegardlessOfDisplayState(element).height;
|
|
Spry.Effect.setStyleProp(element, 'overflow', 'hidden');
|
|
if(needsCache)
|
Spry.Effect.setStyleProp(element, 'height', heightCache+'px');
|
}
|
};
|
|
Spry.Effect.cleanWhitespace = function(element)
|
{
|
var childCountInit = element.childNodes.length;
|
for (var i = childCountInit - 1; i >= 0; i--) {
|
var node = element.childNodes[i];
|
if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
|
try
|
{
|
element.removeChild(node);
|
}
|
catch (e) {Spry.Effect.Utils.showError('Spry.Effect.cleanWhitespace: ' + e);}
|
}
|
};
|
|
Spry.Effect.getComputedStyle = function(element)
|
{
|
return /MSIE/.test(navigator.userAgent) ? element.currentStyle : document.defaultView.getComputedStyle(element, null);
|
};
|
|
Spry.Effect.getDimensions = function(element)
|
{
|
var dimensions = new Spry.Effect.Utils.Rectangle;
|
var computedStyle = null;
|
|
if (element.style.width && /px/i.test(element.style.width))
|
dimensions.width = parseInt(element.style.width, 10); // without padding
|
else
|
{
|
computedStyle = Spry.Effect.getComputedStyle(element);
|
var tryComputedStyle = computedStyle && computedStyle.width && /px/i.test(computedStyle.width);
|
|
if (tryComputedStyle)
|
dimensions.width = parseInt(computedStyle.width, 10); // without padding, includes css
|
|
if (!tryComputedStyle || dimensions.width == 0) // otherwise we might run into problems on safari and opera (mac only)
|
dimensions.width = element.offsetWidth; // includes padding
|
}
|
|
if (element.style.height && /px/i.test(element.style.height))
|
dimensions.height = parseInt(element.style.height, 10); // without padding
|
else
|
{
|
if (!computedStyle)
|
computedStyle = Spry.Effect.getComputedStyle(element);
|
|
var tryComputedStyle = computedStyle && computedStyle.height && /px/i.test(computedStyle.height);
|
|
if (tryComputedStyle)
|
dimensions.height = parseInt(computedStyle.height, 10); // without padding, includes css
|
|
if(!tryComputedStyle || dimensions.height == 0) // otherwise we might run into problems on safari and opera (mac only)
|
dimensions.height = element.offsetHeight; // includes padding
|
}
|
return dimensions;
|
};
|
|
Spry.Effect.getDimensionsRegardlessOfDisplayState = function(element, displayElement)
|
{
|
// If the displayElement display property is set to 'none', we temporarily set its
|
// visibility state to 'hidden' to be able to calculate the dimension.
|
|
var refElement = displayElement ? displayElement : element;
|
var displayOrig = Spry.Effect.getStyleProp(refElement, 'display');
|
var visibilityOrig = Spry.Effect.getStyleProp(refElement, 'visibility');
|
|
if(displayOrig == 'none')
|
{
|
Spry.Effect.setStyleProp(refElement, 'visibility', 'hidden');
|
Spry.Effect.setStyleProp(refElement, 'display', 'block');
|
|
if(window.opera) // opera needs focus to calculate the size for hidden elements
|
refElement.focus();
|
}
|
|
var dimensions = Spry.Effect.getDimensions(element);
|
|
if(displayOrig == 'none') // reset the original values
|
{
|
Spry.Effect.setStyleProp(refElement, 'display', 'none');
|
Spry.Effect.setStyleProp(refElement, 'visibility', visibilityOrig);
|
}
|
return dimensions;
|
};
|
|
Spry.Effect.getOpacity = function(element)
|
{
|
var o = Spry.Effect.getStyleProp(element, "opacity");
|
if (typeof o == 'undefined' || o == null)
|
o = 1.0;
|
return o;
|
};
|
|
Spry.Effect.getBgColor = function(ele)
|
{
|
return Spry.Effect.getStyleProp(ele, "background-color");
|
};
|
|
Spry.Effect.intPropStyle = function(e, prop){
|
var i = parseInt(Spry.Effect.getStyleProp(e, prop), 10);
|
if (isNaN(i))
|
return 0;
|
return i;
|
};
|
|
Spry.Effect.getPosition = function(element)
|
{
|
var position = new Spry.Effect.Utils.Position;
|
var computedStyle = null;
|
|
if (element.style.left && /px/i.test(element.style.left))
|
position.x = parseInt(element.style.left, 10); // without padding
|
else
|
{
|
computedStyle = Spry.Effect.getComputedStyle(element);
|
var tryComputedStyle = computedStyle && computedStyle.left && /px/i.test(computedStyle.left);
|
|
if (tryComputedStyle)
|
position.x = parseInt(computedStyle.left, 10); // without padding, includes css
|
|
if(!tryComputedStyle || position.x == 0) // otherwise we might run into problems on safari and opera (mac only)
|
position.x = element.offsetLeft; // includes padding
|
}
|
|
if (element.style.top && /px/i.test(element.style.top))
|
position.y = parseInt(element.style.top, 10); // without padding
|
else
|
{
|
if (!computedStyle)
|
computedStyle = Spry.Effect.getComputedStyle(element);
|
|
var tryComputedStyle = computedStyle && computedStyle.top && /px/i.test(computedStyle.top);
|
|
if (tryComputedStyle)
|
position.y = parseInt(computedStyle.top, 10); // without padding, includes css
|
|
if(!tryComputedStyle || position.y == 0) // otherwise we might run into problems on safari and opera (mac only)
|
position.y = element.offsetTop; // includes padding
|
}
|
return position;
|
};
|
|
Spry.Effect.getOffsetPosition = Spry.Effect.getPosition; // deprecated
|
|
//////////////////////////////////////////////////////////////////////
|
//
|
// Spry.Effect.Animator
|
// (base class)
|
//
|
//////////////////////////////////////////////////////////////////////
|
|
Spry.Effect.Animator = function(options)
|
{
|
Spry.Utils.Notifier.call(this);
|
|
this.name = 'Animator';
|
this.element = null;
|
this.startMilliseconds = 0;
|
this.repeat = 'none';
|
this.isRunning = false;
|
this.timer = null;
|
this.cancelRemaining = 0;
|
|
if (!options)
|
var options = {};
|
|
if (options.toggle)
|
this.direction = false;
|
else
|
this.direction = Spry.forwards;
|
|
var self = this;
|
if (options.setup != null)
|
this.addObserver({onPreEffect: function(){try{self.options.setup(self.element, self);}catch(e){Spry.Effect.Utils.showError('Spry.Effect.Animator.prototype.start: setup callback: ' + e);}}});
|
|
if (options.finish != null)
|
this.addObserver({onPostEffect: function(){try{self.options.finish(self.element, self);}catch(e){Spry.Effect.Utils.showError('Spry.Effect.Animator.prototype.stop: finish callback: ' + e);}}});
|
|
this.options = {
|
duration: 1000,
|
toggle: false,
|
transition: Spry.linearTransition,
|
interval: 16 // ca. 62 fps
|
};
|
|
this.setOptions(options);
|
if (options.transition)
|
this.setTransition(options.transition);
|
|
if (options.fps)
|
this.setFps(options.fps);
|
};
|
Spry.Effect.Animator.prototype = new Spry.Utils.Notifier();
|
Spry.Effect.Animator.prototype.constructor = Spry.Utils.Animator;
|
|
Spry.Effect.Animator.prototype.notStaticAnimator = true;
|
|
Spry.Effect.Animator.prototype.setOptions = function(options)
|
{
|
if (!options)
|
return;
|
for (var prop in options)
|
this.options[prop] = options[prop];
|
};
|
Spry.Effect.Animator.prototype.setTransition = function(transition){
|
if (typeof transition == 'number' || transition == "1" || transition == "2")
|
switch (parseInt(transition,10))
|
{
|
case 1: transition = Spry.linearTransition; break;
|
case 2: transition = Spry.sinusoidalTransition; break;
|
default: Spry.Effect.Utils.showError('unknown transition');
|
}
|
|
else if (typeof transition == 'string')
|
{
|
if (typeof window[transition] == 'function')
|
transition = window[transition];
|
else if (typeof Spry[transition] == 'function')
|
transition = Spry[transition];
|
else
|
Spry.Effect.Utils.showError('unknown transition');
|
}
|
|
this.options.transition = transition;
|
if (typeof this.effectsArray != 'undefined'){
|
var l = this.effectsArray.length;
|
for (var i = 0; i < l; i++)
|
this.effectsArray[i].effect.setTransition(transition);
|
}
|
};
|
|
Spry.Effect.Animator.prototype.setDuration = function(duration){
|
this.options.duration = duration;
|
if (typeof this.effectsArray != 'undefined')
|
{
|
var l = this.effectsArray.length;
|
for (var i = 0; i < l; i++)
|
{
|
this.effectsArray[i].effect.setDuration(duration);
|
}
|
}
|
};
|
|
Spry.Effect.Animator.prototype.setFps = function(fps){
|
this.options.interval = parseInt(1000 / fps, 10);
|
this.options.fps = fps;
|
if (typeof this.effectsArray != 'undefined')
|
{
|
var l = this.effectsArray.length;
|
for (var i = 0; i < l; i++)
|
{
|
this.effectsArray[i].effect.setFps(fps);
|
}
|
}
|
};
|
|
Spry.Effect.Animator.prototype.start = function(withoutTimer)
|
{
|
if (!this.element)
|
return;
|
|
if (arguments.length == 0)
|
withoutTimer = false;
|
|
if (this.isRunning)
|
this.cancel();
|
|
this.prepareStart();
|
var currDate = new Date();
|
this.startMilliseconds = currDate.getTime();
|
|
if (this.element.id)
|
this.element = document.getElementById(this.element.id);
|
|
if (this.cancelRemaining != 0 && this.options.toggle)
|
{
|
if (this.cancelRemaining < 1 && typeof this.options.transition == 'function')
|
{
|
var startTime = 0;
|
var stopTime = this.options.duration;
|
var start = 0;
|
var stop = 1;
|
var emergency = 0;
|
this.cancelRemaining = Math.round(this.cancelRemaining * 1000) / 1000;
|
var found = false;
|
var middle = 0;
|
while (!found)
|
{
|
if (emergency++ > this.options.duration) break;
|
var half = startTime + ((stopTime - startTime) / 2);
|
middle = Math.round(this.options.transition(half, 1, -1, this.options.duration) * 1000) / 1000;
|
if (middle == this.cancelRemaining)
|
{
|
this.startMilliseconds -= half;
|
found = true;
|
}
|
if (middle < this.cancelRemaining)
|
{
|
stopTime = half;
|
stop = middle;
|
}
|
else
|
{
|
startTime = half;
|
start = middle;
|
}
|
}
|
}
|
this.cancelRemaining = 0;
|
}
|
this.notifyObservers('onPreEffect', this);
|
|
if (withoutTimer == false)
|
{
|
var self = this;
|
this.timer = setInterval(function() { self.drawEffect(); }, this.options.interval);
|
}
|
this.isRunning = true;
|
};
|
Spry.Effect.Animator.prototype.stopFlagReset = function()
|
{
|
if (this.timer)
|
{
|
clearInterval(this.timer);
|
this.timer = null;
|
}
|
this.startMilliseconds = 0;
|
};
|
Spry.Effect.Animator.prototype.stop = function()
|
{
|
this.stopFlagReset();
|
this.notifyObservers('onPostEffect', this);
|
this.isRunning = false;
|
};
|
|
Spry.Effect.Animator.prototype.cancel = function()
|
{
|
var elapsed = this.getElapsedMilliseconds();
|
if (this.startMilliseconds > 0 && elapsed < this.options.duration)
|
this.cancelRemaining = this.options.transition(elapsed, 0, 1, this.options.duration);
|
|
this.stopFlagReset();
|
this.notifyObservers('onCancel', this);
|
this.isRunning = false;
|
};
|
|
Spry.Effect.Animator.prototype.drawEffect = function()
|
{
|
var isRunning = true;
|
|
this.notifyObservers('onStep', this);
|
var timeElapsed = this.getElapsedMilliseconds();
|
|
if (typeof this.options.transition != 'function'){
|
Spry.Effect.Utils.showError('unknown transition');
|
return;
|
}
|
this.animate();
|
|
if (timeElapsed > this.options.duration)
|
{
|
isRunning = false;
|
this.stop();
|
}
|
return isRunning;
|
};
|
|
Spry.Effect.Animator.prototype.getElapsedMilliseconds = function()
|
{
|
if (this.startMilliseconds > 0)
|
{
|
var currDate = new Date();
|
return (currDate.getTime() - this.startMilliseconds);
|
}
|
return 0;
|
};
|
|
Spry.Effect.Animator.prototype.doToggle = function()
|
{
|
if (!this.direction)
|
{
|
this.direction = Spry.forwards;
|
return;
|
}
|
if (this.options.toggle == true)
|
{
|
if (this.direction == Spry.forwards)
|
{
|
this.direction = Spry.backwards;
|
this.notifyObservers('onToggle', this);
|
}
|
else if (this.direction == Spry.backwards)
|
{
|
this.direction = Spry.forwards;
|
}
|
}
|
};
|
|
Spry.Effect.Animator.prototype.prepareStart = function()
|
{
|
if (this.options && this.options.toggle)
|
this.doToggle();
|
};
|
|
Spry.Effect.Animator.prototype.animate = function(){};
|
Spry.Effect.Animator.prototype.onStep = function(el)
|
{
|
if (el != this)
|
this.notifyObservers('onStep', this);
|
};
|
//////////////////////////////////////////////////////////////////////
|
//
|
// Spry.Effect.Move
|
//
|
//////////////////////////////////////////////////////////////////////
|
|
Spry.Effect.Move = function(element, fromPos, toPos, options)
|
{
|
this.dynamicFromPos = false;
|
if (arguments.length == 3)
|
{
|
options = toPos;
|
toPos = fromPos;
|
fromPos = Spry.Effect.getPosition(element);
|
this.dynamicFromPos = true;
|
}
|
|
Spry.Effect.Animator.call(this, options);
|
|
this.name = 'Move';
|
this.element = Spry.Effect.getElement(element);
|
if (!this.element)
|
return;
|
|
if (fromPos.units != toPos.units)
|
Spry.Effect.Utils.showError('Spry.Effect.Move: Conflicting units (' + fromPos.units + ', ' + toPos.units + ')');
|
|
this.units = fromPos.units;
|
this.startX = Number(fromPos.x);
|
this.stopX = Number(toPos.x);
|
this.startY = Number(fromPos.y);
|
this.stopY = Number(toPos.y);
|
};
|
|
Spry.Effect.Move.prototype = new Spry.Effect.Animator();
|
Spry.Effect.Move.prototype.constructor = Spry.Effect.Move;
|
|
Spry.Effect.Move.prototype.animate = function()
|
{
|
var left = 0;
|
var top = 0;
|
var floor = Math.floor;
|
var elapsed = this.getElapsedMilliseconds();
|
if (this.direction == Spry.forwards)
|
{
|
left = floor(this.options.transition(elapsed, this.startX, this.stopX - this.startX, this.options.duration));
|
top = floor(this.options.transition(elapsed, this.startY, this.stopY - this.startY, this.options.duration));
|
}
|
else if (this.direction == Spry.backwards)
|
{
|
left = floor(this.options.transition(elapsed, this.stopX, this.startX - this.stopX, this.options.duration));
|
top = floor(this.options.transition(elapsed, this.stopY, this.startY - this.stopY, this.options.duration));
|
}
|
|
this.element.style.left = left + this.units;
|
this.element.style.top = top + this.units;
|
};
|
|
Spry.Effect.Move.prototype.prepareStart = function()
|
{
|
if (this.options && this.options.toggle)
|
this.doToggle();
|
|
if (this.dynamicFromPos == true)
|
{
|
var fromPos = Spry.Effect.getPosition(this.element);
|
this.startX = fromPos.x;
|
this.startY = fromPos.y;
|
|
this.rangeMoveX = this.startX - this.stopX;
|
this.rangeMoveY= this.startY - this.stopY;
|
}
|
};
|
|
//////////////////////////////////////////////////////////////////////
|
//
|
// Spry.Effect.Size
|
//
|
//////////////////////////////////////////////////////////////////////
|
|
Spry.Effect.Size = function(element, fromRect, toRect, options)
|
{
|
this.dynamicFromRect = false;
|
|
if (arguments.length == 3)
|
{
|
options = toRect;
|
toRect = fromRect;
|
fromRect = Spry.Effect.getDimensionsRegardlessOfDisplayState(element);
|
this.dynamicFromRect = true;
|
}
|
|
Spry.Effect.Animator.call(this, options);
|
|
this.name = 'Size';
|
this.element = Spry.Effect.getElement(element);
|
if (!this.element)
|
return;
|
|
element = this.element;
|
|
if (fromRect.units != toRect.units)
|
{
|
Spry.Effect.Utils.showError('Spry.Effect.Size: Conflicting units (' + fromRect.units + ', ' + toRect.units + ')');
|
return false;
|
}
|
|
this.units = fromRect.units;
|
|
var originalRect = Spry.Effect.getDimensionsRegardlessOfDisplayState(element);
|
this.originalWidth = originalRect.width;
|
this.originalHeight = originalRect.height;
|
|
this.startWidth = fromRect.width;
|
this.startHeight = fromRect.height;
|
this.stopWidth = toRect.width;
|
this.stopHeight = toRect.height;
|
this.childImages = new Array();
|
|
if (this.options.useCSSBox){
|
Spry.Effect.makePositioned(this.element);
|
var intProp = Spry.Effect.intPropStyle;
|
this.startFromBorder_top = intProp(element, 'border-top-width');
|
this.startFromBorder_bottom = intProp(element, 'border-bottom-width');
|
this.startFromBorder_left = intProp(element, 'border-left-width');
|
this.startFromBorder_right = intProp(element, 'border-right-width');
|
this.startFromPadding_top = intProp(element, 'padding-top');
|
this.startFromPadding_bottom = intProp(element, 'padding-bottom');
|
this.startFromPadding_left = intProp(element, 'padding-left');
|
this.startFromPadding_right = intProp(element, 'padding-right');
|
this.startFromMargin_top = intProp(element, 'margin-top');
|
this.startFromMargin_bottom = intProp(element, 'margin-bottom');
|
this.startFromMargin_right = intProp(element, 'margin-right');
|
this.startFromMargin_left = intProp(element, 'margin-left');
|
this.startLeft = intProp(element, 'left');
|
this.startTop = intProp(element, 'top');
|
}
|
|
if(this.options.scaleContent)
|
Spry.Effect.Utils.fetchChildImages(element, this.childImages);
|
|
this.fontFactor = 1.0;
|
var fontSize = Spry.Effect.getStyleProp(this.element, 'font-size');
|
if(fontSize && /em\s*$/.test(fontSize))
|
this.fontFactor = parseFloat(fontSize);
|
|
var isPercent = Spry.Effect.Utils.isPercentValue;
|
|
if (isPercent(this.startWidth))
|
{
|
var startWidthPercent = Spry.Effect.Utils.getPercentValue(this.startWidth);
|
this.startWidth = originalRect.width * (startWidthPercent / 100);
|
}
|
|
if (isPercent(this.startHeight))
|
{
|
var startHeightPercent = Spry.Effect.Utils.getPercentValue(this.startHeight);
|
this.startHeight = originalRect.height * (startHeightPercent / 100);
|
}
|
|
if (isPercent(this.stopWidth))
|
{
|
var stopWidthPercent = Spry.Effect.Utils.getPercentValue(this.stopWidth);
|
this.stopWidth = originalRect.width * (stopWidthPercent / 100);
|
}
|
|
if (isPercent(this.stopHeight))
|
{
|
var stopHeightPercent = Spry.Effect.Utils.getPercentValue(this.stopHeight);
|
this.stopHeight = originalRect.height * (stopHeightPercent / 100);
|
}
|
|
this.enforceVisible = Spry.Effect.isInvisible(this.element);
|
};
|
|
Spry.Effect.Size.prototype = new Spry.Effect.Animator();
|
Spry.Effect.Size.prototype.constructor = Spry.Effect.Size;
|
|
Spry.Effect.Size.prototype.animate = function()
|
{
|
var width = 0;
|
var height = 0;
|
var fontSize = 0;
|
var direction = 0;
|
var floor = Math.floor;
|
var elapsed = this.getElapsedMilliseconds();
|
|
if (this.direction == Spry.forwards) {
|
width = floor(this.options.transition(elapsed, this.startWidth, this.stopWidth - this.startWidth, this.options.duration));
|
height = floor(this.options.transition(elapsed, this.startHeight, this.stopHeight - this.startHeight, this.options.duration));
|
direction = 1;
|
} else if (this.direction == Spry.backwards) {
|
width = floor(this.options.transition(elapsed, this.stopWidth, this.startWidth - this.stopWidth, this.options.duration));
|
height = floor(this.options.transition(elapsed, this.stopHeight, this.startHeight - this.stopHeight, this.options.duration));
|
direction = -1;
|
}
|
|
var propFactor = width/this.originalWidth;
|
fontSize = this.fontFactor * propFactor;
|
|
var elStyle = this.element.style;
|
if (width < 0)
|
width = 0;
|
|
if (height < 0)
|
height = 0;
|
|
elStyle.width = width + this.units;
|
elStyle.height = height + this.units;
|
|
if (typeof this.options.useCSSBox != 'undefined' && this.options.useCSSBox == true)
|
{
|
var intProp = Spry.Effect.intPropStyle;
|
var origTop = intProp(this.element, 'top');
|
var origLeft = intProp(this.element, 'left');
|
var origMarginTop = intProp(this.element, 'margin-top');
|
var origMarginLeft = intProp(this.element, 'margin-left');
|
|
var widthFactor = propFactor;
|
var heightFactor = height / this.originalHeight;
|
var border_top = floor(this.startFromBorder_top * heightFactor);
|
var border_bottom = floor(this.startFromBorder_bottom * heightFactor);
|
var border_left = floor(this.startFromBorder_left * widthFactor);
|
var border_right = floor(this.startFromBorder_right * widthFactor);
|
var padding_top = floor(this.startFromPadding_top * heightFactor);
|
var padding_bottom = floor(this.startFromPadding_bottom * heightFactor);
|
var padding_left = floor(this.startFromPadding_left * widthFactor);
|
var padding_right = floor(this.startFromPadding_right * widthFactor);
|
var margin_top = floor(this.startFromMargin_top * heightFactor);
|
var margin_bottom = floor(this.startFromMargin_bottom * heightFactor);
|
var margin_right = floor(this.startFromMargin_right * widthFactor);
|
var margin_left = floor(this.startFromMargin_left * widthFactor);
|
|
elStyle.borderTopWidth = border_top + this.units;
|
elStyle.borderBottomWidth = border_bottom + this.units;
|
elStyle.borderLeftWidth = border_left + this.units;
|
elStyle.borderRightWidth = border_right + this.units;
|
elStyle.paddingTop = padding_top + this.units;
|
elStyle.paddingBottom = padding_bottom + this.units;
|
elStyle.paddingLeft = padding_left + this.units;
|
elStyle.paddingRight = padding_right + this.units;
|
elStyle.marginTop = margin_top + this.units;
|
elStyle.marginBottom = margin_bottom + this.units;
|
elStyle.marginLeft = margin_left + this.units;
|
elStyle.marginRight = margin_right + this.units;
|
|
// compensate the margin shrinking
|
elStyle.left = floor(origLeft + origMarginLeft - margin_left) + this.units;
|
elStyle.top = floor(origTop + origMarginTop - margin_top) + this.units;
|
}
|
|
if (this.options.scaleContent)
|
{
|
|
for(var i=0; i < this.childImages.length; i++)
|
{
|
this.childImages[i][0].style.width = propFactor * this.childImages[i][1] + this.units;
|
this.childImages[i][0].style.height = propFactor * this.childImages[i][2] + this.units;
|
}
|
this.element.style.fontSize = fontSize + 'em';
|
}
|
|
if(this.enforceVisible)
|
{
|
Spry.Effect.enforceVisible(this.element);
|
this.enforceVisible = false;
|
}
|
};
|
|
Spry.Effect.Size.prototype.prepareStart = function()
|
{
|
if (this.options && this.options.toggle)
|
this.doToggle();
|
|
if (this.dynamicFromRect == true)
|
{
|
var fromRect = Spry.Effect.getDimensions(element);
|
this.startWidth = fromRect.width;
|
this.startHeight = fromRect.height;
|
|
this.widthRange = this.startWidth - this.stopWidth;
|
this.heightRange = this.startHeight - this.stopHeight;
|
}
|
};
|
|
//////////////////////////////////////////////////////////////////////
|
//
|
// Spry.Effect.Opacity
|
//
|
//////////////////////////////////////////////////////////////////////
|
|
Spry.Effect.Opacity = function(element, startOpacity, stopOpacity, options)
|
{
|
this.dynamicStartOpacity = false;
|
if (arguments.length == 3)
|
{
|
options = stopOpacity;
|
stopOpacity = startOpacity;
|
startOpacity = Spry.Effect.getOpacity(element);
|
this.dynamicStartOpacity = true;
|
}
|
|
Spry.Effect.Animator.call(this, options);
|
|
this.name = 'Opacity';
|
this.element = Spry.Effect.getElement(element);
|
if (!this.element)
|
return;
|
|
// make this work on IE on elements without 'layout'
|
if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout))
|
Spry.Effect.setStyleProp(this.element, 'zoom', '1');
|
|
this.startOpacity = startOpacity;
|
this.stopOpacity = stopOpacity;
|
this.enforceVisible = Spry.Effect.isInvisible(this.element);
|
};
|
|
Spry.Effect.Opacity.prototype = new Spry.Effect.Animator();
|
Spry.Effect.Opacity.prototype.constructor = Spry.Effect.Opacity;
|
|
Spry.Effect.Opacity.prototype.animate = function()
|
{
|
var opacity = 0;
|
var elapsed = this.getElapsedMilliseconds();
|
if (this.direction == Spry.forwards)
|
opacity = this.options.transition(elapsed, this.startOpacity, this.stopOpacity - this.startOpacity, this.options.duration);
|
else if (this.direction == Spry.backwards)
|
opacity = this.options.transition(elapsed, this.stopOpacity, this.startOpacity - this.stopOpacity, this.options.duration);
|
|
if (opacity < 0)
|
opacity = 0;
|
|
if(/MSIE/.test(navigator.userAgent))
|
{
|
var tmpval = Spry.Effect.getStyleProp(this.element,'filter');
|
if (tmpval){
|
tmpval = tmpval.replace(/alpha\(opacity=[0-9]{1,3}\)/g, '');
|
}
|
this.element.style.filter = tmpval + "alpha(opacity=" + Math.floor(opacity * 100) + ")";
|
}
|
else
|
this.element.style.opacity = opacity;
|
|
if(this.enforceVisible)
|
{
|
Spry.Effect.enforceVisible(this.element);
|
this.enforceVisible = false;
|
}
|
};
|
|
Spry.Effect.Opacity.prototype.prepareStart = function()
|
{
|
if (this.options && this.options.toggle)
|
this.doToggle();
|
|
if (this.dynamicStartOpacity == true)
|
{
|
this.startOpacity = Spry.Effect.getOpacity(element);
|
this.opacityRange = this.startOpacity - this.stopOpacity;
|
}
|
};
|
|
//////////////////////////////////////////////////////////////////////
|
//
|
// Spry.Effect.Color
|
//
|
//////////////////////////////////////////////////////////////////////
|
|
Spry.Effect.Color = function(element, startColor, stopColor, options)
|
{
|
this.dynamicStartColor = false;
|
if (arguments.length == 3)
|
{
|
options = stopColor;
|
stopColor = startColor;
|
startColor = Spry.Effect.getBgColor(element);
|
this.dynamicStartColor = true;
|
}
|
|
Spry.Effect.Animator.call(this, options);
|
|
this.name = 'Color';
|
this.element = Spry.Effect.getElement(element);
|
if (!this.element)
|
return;
|
|
this.startColor = startColor;
|
this.stopColor = stopColor;
|
this.startRedColor = Spry.Effect.Utils.hexToInt(startColor.substr(1,2));
|
this.startGreenColor = Spry.Effect.Utils.hexToInt(startColor.substr(3,2));
|
this.startBlueColor = Spry.Effect.Utils.hexToInt(startColor.substr(5,2));
|
this.stopRedColor = Spry.Effect.Utils.hexToInt(stopColor.substr(1,2));
|
this.stopGreenColor = Spry.Effect.Utils.hexToInt(stopColor.substr(3,2));
|
this.stopBlueColor = Spry.Effect.Utils.hexToInt(stopColor.substr(5,2));
|
};
|
|
Spry.Effect.Color.prototype = new Spry.Effect.Animator();
|
Spry.Effect.Color.prototype.constructor = Spry.Effect.Color;
|
|
Spry.Effect.Color.prototype.animate = function()
|
{
|
var redColor = 0;
|
var greenColor = 0;
|
var blueColor = 0;
|
var floor = Math.floor;
|
var elapsed = this.getElapsedMilliseconds();
|
|
if (this.direction == Spry.forwards)
|
{
|
redColor = floor(this.options.transition(elapsed, this.startRedColor, this.stopRedColor - this.startRedColor, this.options.duration));
|
greenColor = floor(this.options.transition(elapsed, this.startGreenColor, this.stopGreenColor - this.startGreenColor, this.options.duration));
|
blueColor = floor(this.options.transition(elapsed, this.startBlueColor, this.stopBlueColor - this.startBlueColor, this.options.duration));
|
}
|
else if (this.direction == Spry.backwards)
|
{
|
redColor = floor(this.options.transition(elapsed, this.stopRedColor, this.startRedColor - this.stopRedColor, this.options.duration));
|
greenColor = floor(this.options.transition(elapsed, this.stopGreenColor, this.startGreenColor - this.stopGreenColor, this.options.duration));
|
blueColor = floor(this.options.transition(elapsed, this.stopBlueColor, this.startBlueColor - this.stopBlueColor, this.options.duration));
|
}
|
|
this.element.style.backgroundColor = Spry.Effect.Utils.rgb(redColor, greenColor, blueColor);
|
};
|
|
Spry.Effect.Color.prototype.prepareStart = function()
|
{
|
if (this.options && this.options.toggle)
|
this.doToggle();
|
|
if (this.dynamicStartColor == true)
|
{
|
this.startColor = Spry.Effect.getBgColor(element);
|
this.startRedColor = Spry.Effect.Utils.hexToInt(startColor.substr(1,2));
|
this.startGreenColor = Spry.Effect.Utils.hexToInt(startColor.substr(3,2));
|
this.startBlueColor = Spry.Effect.Utils.hexToInt(startColor.substr(5,2));
|
this.redColorRange = this.startRedColor - this.stopRedColor;
|
this.greenColorRange = this.startGreenColor - this.stopGreenColor;
|
this.blueColorRange = this.startBlueColor - this.stopBlueColor;
|
}
|
};
|
|
//////////////////////////////////////////////////////////////////////
|
//
|
// Spry.Effect.Cluster
|
//
|
//////////////////////////////////////////////////////////////////////
|
|
Spry.Effect.Cluster = function(options)
|
{
|
Spry.Effect.Animator.call(this, options);
|
|
this.name = 'Cluster';
|
this.effectsArray = new Array();
|
this.currIdx = -1;
|
var _ClusteredEffect = function(effect, kind)
|
{
|
this.effect = effect;
|
this.kind = kind; // "parallel" or "queue"
|
this.isRunning = false;
|
};
|
|
this.ClusteredEffect = _ClusteredEffect;
|
};
|
|
Spry.Effect.Cluster.prototype = new Spry.Effect.Animator();
|
Spry.Effect.Cluster.prototype.constructor = Spry.Effect.Cluster;
|
|
Spry.Effect.Cluster.prototype.setInterval = function(interval){
|
var l = this.effectsArray.length;
|
this.options.interval = interval;
|
for (var i = 0; i < l; i++)
|
{
|
this.effectsArray[i].effect.setInterval(interval);
|
}
|
};
|
Spry.Effect.Cluster.prototype.drawEffect = function()
|
{
|
var isRunning = true;
|
var allEffectsDidRun = false;
|
var baseEffectIsStillRunning = false;
|
var evalNextEffectsRunning = false;
|
|
if ((this.currIdx == -1 && this.direction == Spry.forwards) || (this.currIdx == this.effectsArray.length && this.direction == Spry.backwards))
|
this.initNextEffectsRunning();
|
|
var start = this.direction == Spry.forwards ? 0 : this.effectsArray.length-1;
|
var stop = this.direction == Spry.forwards ? this.effectsArray.length : -1;
|
var step = this.direction == Spry.forwards ? 1 : -1;
|
for (var i = start; i != stop; i+=step)
|
{
|
if (this.effectsArray[i].isRunning == true)
|
{
|
baseEffectIsStillRunning = this.effectsArray[i].effect.drawEffect();
|
if (baseEffectIsStillRunning == false && i == this.currIdx)
|
{
|
this.effectsArray[i].isRunning = false;
|
evalNextEffectsRunning = true;
|
}
|
}
|
}
|
|
if (evalNextEffectsRunning == true)
|
allEffectsDidRun = this.initNextEffectsRunning();
|
|
if (allEffectsDidRun == true) {
|
this.stop();
|
isRunning = false;
|
for (var i = 0; i < this.effectsArray.length; i++)
|
this.effectsArray[i].isRunning = false;
|
|
this.currIdx = this.direction == Spry.forwards ? this.effectsArray.length: -1;
|
}
|
return isRunning;
|
};
|
|
Spry.Effect.Cluster.prototype.initNextEffectsRunning = function()
|
{
|
var allEffectsDidRun = false;
|
var step = this.direction == Spry.forwards ? 1 : -1;
|
var stop = this.direction == Spry.forwards ? this.effectsArray.length : -1;
|
this.currIdx+=step;
|
if ( (this.currIdx > (this.effectsArray.length - 1) && this.direction == Spry.forwards) || (this.currIdx < 0 && this.direction == Spry.backwards))
|
allEffectsDidRun = true;
|
else
|
for (var i = this.currIdx; i != stop; i+=step)
|
{
|
if ((i > this.currIdx && this.direction == Spry.forwards || i < this.currIdx && this.direction == Spry.backwards) && this.effectsArray[i].kind == "queue")
|
break;
|
this.effectsArray[i].effect.start(true);
|
this.effectsArray[i].isRunning = true;
|
this.currIdx = i;
|
}
|
|
return allEffectsDidRun;
|
};
|
|
Spry.Effect.Cluster.prototype.toggleCluster = function()
|
{
|
if (!this.direction)
|
{
|
this.direction = Spry.forwards;
|
return;
|
}
|
|
if (this.options.toggle == true)
|
{
|
if (this.direction == Spry.forwards)
|
{
|
this.direction = Spry.backwards;
|
this.notifyObservers('onToggle', this);
|
this.currIdx = this.effectsArray.length;
|
}
|
else if (this.direction == Spry.backwards)
|
{
|
this.direction = Spry.forwards;
|
this.currIdx = -1;
|
}
|
}
|
else
|
{
|
if (this.direction == Spry.forwards)
|
this.currIdx = -1;
|
else if (this.direction == Spry.backwards)
|
this.currIdx = this.effectsArray.length;
|
}
|
};
|
|
Spry.Effect.Cluster.prototype.doToggle = function()
|
{
|
this.toggleCluster();
|
|
// toggle all effects of the cluster, too
|
for (var i = 0; i < this.effectsArray.length; i++)
|
{
|
if (this.effectsArray[i].effect.options && (this.effectsArray[i].effect.options.toggle != null))
|
if (this.effectsArray[i].effect.options.toggle == true)
|
this.effectsArray[i].effect.doToggle();
|
}
|
};
|
|
Spry.Effect.Cluster.prototype.cancel = function()
|
{
|
for (var i = 0; i < this.effectsArray.length; i++)
|
if (this.effectsArray[i].effect.isRunning)
|
this.effectsArray[i].effect.cancel();
|
|
var elapsed = this.getElapsedMilliseconds();
|
if (this.startMilliseconds > 0 && elapsed < this.options.duration)
|
this.cancelRemaining = this.options.transition(elapsed, 0, 1, this.options.duration);
|
this.stopFlagReset();
|
this.notifyObservers('onCancel', this);
|
this.isRunning = false;
|
};
|
|
Spry.Effect.Cluster.prototype.addNextEffect = function(effect)
|
{
|
effect.addObserver(this);
|
this.effectsArray[this.effectsArray.length] = new this.ClusteredEffect(effect, "queue");
|
if (this.effectsArray.length == 1)
|
{
|
// with the first added effect we know the element
|
// that the cluster is working on
|
this.element = effect.element;
|
}
|
};
|
|
Spry.Effect.Cluster.prototype.addParallelEffect = function(effect)
|
{
|
if (this.effectsArray.length == 0 || this.effectsArray[this.effectsArray.length-1].kind != 'parallel')
|
effect.addObserver(this);
|
|
this.effectsArray[this.effectsArray.length] = new this.ClusteredEffect(effect, "parallel");
|
if (this.effectsArray.length == 1)
|
{
|
// with the first added effect we know the element
|
// that the cluster is working on
|
this.element = effect.element;
|
}
|
};
|
|
Spry.Effect.Cluster.prototype.prepareStart = function()
|
{
|
this.toggleCluster();
|
};
|
|
//////////////////////////////////////////////////////////////////////
|
//
|
// Combination effects
|
// Custom effects can be build by combining basic effect bahaviour
|
// like Move, Size, Color, Opacity
|
//
|
//////////////////////////////////////////////////////////////////////
|
|
Spry.Effect.Fade = function (element, options)
|
{
|
if (!this.notStaticAnimator)
|
return Spry.Effect.Utils.showInitError('Fade');
|
|
Spry.Effect.Cluster.call(this, options);
|
|
this.name = 'Fade';
|
var element = Spry.Effect.getElement(element);
|
this.element = element;
|
if (!this.element)
|
return;
|
var durationInMilliseconds = 1000;
|
var fromOpacity = 0.0;
|
var toOpacity = 100.0;
|
var doToggle = false;
|
var transition = Spry.fifthTransition;
|
var fps = 60;
|
var originalOpacity = 0;
|
if(/MSIE/.test(navigator.userAgent))
|
originalOpacity = parseInt(Spry.Effect.getStylePropRegardlessOfDisplayState(this.element, 'filter').replace(/alpha\(opacity=([0-9]{1,3})\)/g, '$1'), 10);
|
else
|
originalOpacity = parseInt(Spry.Effect.getStylePropRegardlessOfDisplayState(this.element, 'opacity') * 100, 10);
|
|
if (isNaN(originalOpacity))
|
originalOpacity = 100;
|
|
if (options)
|
{
|
if (options.duration != null) durationInMilliseconds = options.duration;
|
if (options.from != null){
|
if (Spry.Effect.Utils.isPercentValue(options.from))
|
fromOpacity = Spry.Effect.Utils.getPercentValue(options.from) * originalOpacity / 100;
|
else
|
fromOpacity = options.from;
|
}
|
if (options.to != null)
|
{
|
if (Spry.Effect.Utils.isPercentValue(options.to))
|
toOpacity = Spry.Effect.Utils.getPercentValue(options.to) * originalOpacity / 100;
|
else
|
toOpacity = options.to;
|
}
|
if (options.toggle != null) doToggle = options.toggle;
|
if (options.transition != null) transition = options.transition;
|
if (options.fps != null) fps = options.fps;
|
else this.options.transition = transition;
|
}
|
|
fromOpacity = fromOpacity/ 100.0;
|
toOpacity = toOpacity / 100.0;
|
|
options = {duration: durationInMilliseconds, toggle: doToggle, transition: transition, from: fromOpacity, to: toOpacity, fps: fps};
|
var fadeEffect = new Spry.Effect.Opacity(element, fromOpacity, toOpacity, options);
|
this.addNextEffect(fadeEffect);
|
};
|
|
Spry.Effect.Fade.prototype = new Spry.Effect.Cluster();
|
Spry.Effect.Fade.prototype.constructor = Spry.Effect.Fade;
|
|
Spry.Effect.Blind = function (element, options)
|
{
|
if (!this.notStaticAnimator)
|
return Spry.Effect.Utils.showInitError('Blind');
|
|
Spry.Effect.Cluster.call(this, options);
|
|
this.name = 'Blind';
|
var element = Spry.Effect.getElement(element);
|
this.element = element;
|
if (!this.element)
|
return;
|
var durationInMilliseconds = 1000;
|
var doToggle = false;
|
var kindOfTransition = Spry.circleTransition;
|
var fps = 60;
|
var doScaleContent = false;
|
|
Spry.Effect.makeClipping(element);
|
|
var originalRect = Spry.Effect.getDimensionsRegardlessOfDisplayState(element);
|
var fromHeightPx = originalRect.height;
|
var toHeightPx = 0;
|
var optionFrom = options ? options.from : originalRect.height;
|
var optionTo = options ? options.to : 0;
|
var fullCSSBox = false;
|
|
|
if (options)
|
{
|
if (options.duration != null) durationInMilliseconds = options.duration;
|
if (options.from != null)
|
{
|
if (Spry.Effect.Utils.isPercentValue(options.from))
|
fromHeightPx = Spry.Effect.Utils.getPercentValue(options.from) * originalRect.height / 100;
|
else
|
fromHeightPx = Spry.Effect.Utils.getPixelValue(options.from);
|
}
|
if (options.to != null)
|
{
|
if (Spry.Effect.Utils.isPercentValue(options.to))
|
toHeightPx = Spry.Effect.Utils.getPercentValue(options.to) * originalRect.height / 100;
|
else
|
toHeightPx = Spry.Effect.Utils.getPixelValue(options.to);
|
}
|
if (options.toggle != null) doToggle = options.toggle;
|
if (options.transition != null) kindOfTransition = options.transition;
|
if (options.fps != null) fps = options.fps;
|
if (options.useCSSBox != null) fullCSSBox = options.useCSSBox;
|
}
|
|
var fromRect = new Spry.Effect.Utils.Rectangle;
|
fromRect.width = originalRect.width;
|
fromRect.height = fromHeightPx;
|
|
var toRect = new Spry.Effect.Utils.Rectangle;
|
toRect.width = originalRect.width;
|
toRect.height = toHeightPx;
|
|
options = {duration:durationInMilliseconds, toggle:doToggle, transition:kindOfTransition, scaleContent:doScaleContent, useCSSBox: fullCSSBox, from: optionFrom, to: optionTo, fps: fps};
|
var blindEffect = new Spry.Effect.Size(element, fromRect, toRect, options);
|
this.addNextEffect(blindEffect);
|
};
|
|
Spry.Effect.Blind.prototype = new Spry.Effect.Cluster();
|
Spry.Effect.Blind.prototype.constructor = Spry.Effect.Blind;
|
|
Spry.Effect.Highlight = function (element, options)
|
{
|
if (!this.notStaticAnimator)
|
return Spry.Effect.Utils.showInitError('Highlight');
|
|
Spry.Effect.Cluster.call(this, options);
|
|
this.name = 'Highlight';
|
var durationInMilliseconds = 1000;
|
var toColor = "#ffffff";
|
var doToggle = false;
|
var kindOfTransition = Spry.sinusoidalTransition;
|
var fps = 60;
|
var element = Spry.Effect.getElement(element);
|
this.element = element;
|
if (!this.element)
|
return;
|
var fromColor = Spry.Effect.getBgColor(element);
|
if (fromColor == "transparent") fromColor = "#ffff99";
|
|
if (options)
|
{
|
if (options.duration != null) durationInMilliseconds = options.duration;
|
if (options.from != null) fromColor = options.from;
|
if (options.to != null) toColor = options.to;
|
if (options.toggle != null) doToggle = options.toggle;
|
if (options.transition != null) kindOfTransition = options.transition;
|
if (options.fps != null) fps = options.fps;
|
}
|
|
if ( fromColor.indexOf('rgb') != -1 )
|
var fromColor = Spry.Effect.Utils.rgb(parseInt(fromColor.substring(fromColor.indexOf('(')+1, fromColor.indexOf(',')),10), parseInt(fromColor.substring(fromColor.indexOf(',')+1, fromColor.lastIndexOf(',')),10), parseInt(fromColor.substring(fromColor.lastIndexOf(',')+1, fromColor.indexOf(')')),10));
|
|
if ( toColor.indexOf('rgb') != -1 )
|
var toColor = Spry.Effect.Utils.rgb(parseInt(toColor.substring(toColor.indexOf('(')+1, toColor.indexOf(',')),10), parseInt(toColor.substring(toColor.indexOf(',')+1, toColor.lastIndexOf(',')),10), parseInt(toColor.substring(toColor.lastIndexOf(',')+1, toColor.indexOf(')')),10));
|
|
var fromColor = Spry.Effect.Utils.longColorVersion(fromColor);
|
var toColor = Spry.Effect.Utils.longColorVersion(toColor);
|
|
this.restoreBackgroundImage = Spry.Effect.getStyleProp(element, 'background-image');
|
|
options = {duration: durationInMilliseconds, toggle: doToggle, transition: kindOfTransition, fps: fps};
|
var highlightEffect = new Spry.Effect.Color(element, fromColor, toColor, options);
|
this.addNextEffect(highlightEffect);
|
|
this.addObserver({
|
onPreEffect:
|
function(effect){
|
Spry.Effect.setStyleProp(effect.element, 'background-image', 'none');
|
},
|
onPostEffect:
|
function(effect){
|
Spry.Effect.setStyleProp(effect.element, 'background-image', effect.restoreBackgroundImage);
|
|
if (effect.direction == Spry.forwards && effect.options.restoreColor)
|
Spry.Effect.setStyleProp(element, 'background-color', effect.options.restoreColor);
|
}
|
});
|
};
|
|
Spry.Effect.Highlight.prototype = new Spry.Effect.Cluster();
|
Spry.Effect.Highlight.prototype.constructor = Spry.Effect.Highlight;
|
|
Spry.Effect.Slide = function (element, options)
|
{
|
if (!this.notStaticAnimator)
|
return Spry.Effect.Utils.showInitError('Slide');
|
|
Spry.Effect.Cluster.call(this, options);
|
|
this.name = 'Slide';
|
var element = Spry.Effect.getElement(element);
|
this.element = element;
|
if (!this.element)
|
return;
|
var durationInMilliseconds = 1000;
|
var doToggle = false;
|
var kindOfTransition = Spry.sinusoidalTransition;
|
var fps = 60;
|
var slideHorizontally = false;
|
var firstChildElt = Spry.Effect.Utils.getFirstChildElement(element);
|
var direction = -1;
|
|
// IE 7 does not clip static positioned elements -> make element position relative
|
if(/MSIE 7.0/.test(navigator.userAgent) && /Windows NT/.test(navigator.userAgent))
|
Spry.Effect.makePositioned(element);
|
|
Spry.Effect.makeClipping(element);
|
|
// for IE 6 on win: check if position is static or fixed -> not supported and would cause trouble
|
if(/MSIE 6.0/.test(navigator.userAgent) && /Windows NT/.test(navigator.userAgent))
|
{
|
var pos = Spry.Effect.getStyleProp(element, 'position');
|
if(pos && (pos == 'static' || pos == 'fixed'))
|
{
|
Spry.Effect.setStyleProp(element, 'position', 'relative');
|
Spry.Effect.setStyleProp(element, 'top', '');
|
Spry.Effect.setStyleProp(element, 'left', '');
|
}
|
}
|
|
if(firstChildElt)
|
{
|
Spry.Effect.makePositioned(firstChildElt);
|
Spry.Effect.makeClipping(firstChildElt);
|
|
var childRect = Spry.Effect.getDimensionsRegardlessOfDisplayState(firstChildElt, element);
|
Spry.Effect.setStyleProp(firstChildElt, 'width', childRect.width + 'px');
|
}
|
|
var fromDim = Spry.Effect.getDimensionsRegardlessOfDisplayState(element);
|
|
var initDim = new Spry.Effect.Utils.Rectangle();
|
var toDim = new Spry.Effect.Utils.Rectangle();
|
initDim.width = toDim.width = fromDim.width;
|
initDim.height = toDim.height = fromDim.height;
|
|
if (!this.options.to){
|
if (!options)
|
options = {};
|
|
options.to = '0%';
|
}
|
|
if (options && options.horizontal !== null && options.horizontal === true)
|
slideHorizontally = true;
|
|
if (options.duration != null) durationInMilliseconds = options.duration;
|
|
if (options.from != null)
|
{
|
if(slideHorizontally)
|
{
|
if (Spry.Effect.Utils.isPercentValue(options.from))
|
fromDim.width = initDim.width * Spry.Effect.Utils.getPercentValue(options.from) / 100;
|
else
|
fromDim.width = Spry.Effect.Utils.getPixelValue(options.from);
|
}
|
else
|
{
|
if (Spry.Effect.Utils.isPercentValue(options.from))
|
fromDim.height = initDim.height * Spry.Effect.Utils.getPercentValue(options.from) / 100;
|
else
|
fromDim.height = Spry.Effect.Utils.getPixelValue(options.from);
|
}
|
}
|
|
if (options.to != null)
|
{
|
if(slideHorizontally)
|
{
|
if (Spry.Effect.Utils.isPercentValue(options.to))
|
toDim.width = initDim.width * Spry.Effect.Utils.getPercentValue(options.to) / 100;
|
else
|
toDim.width = Spry.Effect.Utils.getPixelValue(options.to);
|
}
|
else
|
{
|
if (Spry.Effect.Utils.isPercentValue(options.to))
|
toDim.height = initDim.height * Spry.Effect.Utils.getPercentValue(options.to) / 100;
|
else
|
toDim.height = Spry.Effect.Utils.getPixelValue(options.to);
|
}
|
}
|
if (options.toggle != null) doToggle = options.toggle;
|
if (options.transition != null) kindOfTransition = options.transition;
|
if (options.fps != null) fps = options.fps;
|
|
options = {duration: durationInMilliseconds, transition: kindOfTransition, scaleContent: false, toggle:doToggle, fps: fps};
|
var size = new Spry.Effect.Size(element, fromDim, toDim, options);
|
this.addParallelEffect(size);
|
|
if ( (fromDim.width < toDim.width && slideHorizontally) || (fromDim.height < toDim.height && !slideHorizontally))
|
direction = 1;
|
|
var fromPos = new Spry.Effect.Utils.Position();
|
var toPos = new Spry.Effect.Utils.Position();
|
toPos.x = fromPos.x = Spry.Effect.intPropStyle(firstChildElt, 'left');
|
toPos.y = fromPos.y = Spry.Effect.intPropStyle(firstChildElt, 'top');
|
toPos.units = fromPos.units;
|
|
if (slideHorizontally)
|
toPos.x = parseInt(fromPos.x + direction * (fromDim.width - toDim.width), 10);
|
else
|
toPos.y = parseInt(fromPos.y + direction * (fromDim.height - toDim.height), 10);
|
|
if (direction == 1){
|
var tmp = fromPos;
|
var fromPos = toPos;
|
var toPos = tmp;
|
}
|
|
options = {duration: durationInMilliseconds, transition: kindOfTransition, toggle:doToggle, from: fromPos, to: toPos, fps: fps};
|
var move = new Spry.Effect.Move(firstChildElt, fromPos, toPos, options);
|
this.addParallelEffect(move);
|
};
|
|
Spry.Effect.Slide.prototype = new Spry.Effect.Cluster();
|
Spry.Effect.Slide.prototype.constructor = Spry.Effect.Slide;
|
|
Spry.Effect.Grow = function (element, options)
|
{
|
if (!element)
|
return;
|
if (!this.notStaticAnimator)
|
return Spry.Effect.Utils.showInitError('Grow');
|
|
Spry.Effect.Cluster.call(this, options);
|
|
this.name = 'Grow';
|
var durationInMilliseconds = 1000;
|
var doToggle = false;
|
var doScaleContent = true;
|
var calcHeight = false;
|
var growFromCenter = true;
|
var fullCSSBox = false;
|
var kindOfTransition = Spry.squareTransition;
|
var fps = 60;
|
var element = Spry.Effect.getElement(element);
|
this.element = element;
|
if (!this.element)
|
return;
|
|
Spry.Effect.makeClipping(element);
|
|
var dimRect = Spry.Effect.getDimensionsRegardlessOfDisplayState(element);
|
var originalWidth = dimRect.width;
|
var originalHeight = dimRect.height;
|
var propFactor = (originalWidth == 0) ? 1 :originalHeight/originalWidth;
|
|
var fromRect = new Spry.Effect.Utils.Rectangle;
|
fromRect.width = 0;
|
fromRect.height = 0;
|
|
var toRect = new Spry.Effect.Utils.Rectangle;
|
toRect.width = originalWidth;
|
toRect.height = originalHeight;
|
|
var optionFrom = options ? options.from : dimRect.width;
|
var optionTo = options ? options.to : 0;
|
var pixelValue = Spry.Effect.Utils.getPixelValue;
|
|
if (options)
|
{
|
if (options.growCenter != null) growFromCenter = options.growCenter;
|
if (options.duration != null) durationInMilliseconds = options.duration;
|
if (options.useCSSBox != null) fullCSSBox = options.useCSSBox;
|
if (options.scaleContent != null) doScaleContent = options.scaleContent;
|
if (options.from != null)
|
{
|
if (Spry.Effect.Utils.isPercentValue(options.from))
|
{
|
fromRect.width = originalWidth * (Spry.Effect.Utils.getPercentValue(options.from) / 100);
|
fromRect.height = originalHeight * (Spry.Effect.Utils.getPercentValue(options.from) / 100);
|
}
|
else
|
{
|
if(calcHeight)
|
{
|
fromRect.height = pixelValue(options.from);
|
fromRect.width = pixelValue(options.from) / propFactor;
|
}
|
else
|
{
|
fromRect.width = pixelValue(options.from);
|
fromRect.height = propFactor * pixelValue(options.from);
|
}
|
}
|
}
|
if (options.to != null)
|
{
|
if (Spry.Effect.Utils.isPercentValue(options.to))
|
{
|
toRect.width = originalWidth * (Spry.Effect.Utils.getPercentValue(options.to) / 100);
|
toRect.height = originalHeight * (Spry.Effect.Utils.getPercentValue(options.to) / 100);
|
}
|
else
|
{
|
if(calcHeight)
|
{
|
toRect.height = pixelValue(options.to);
|
toRect.width = pixelValue(options.to) / propFactor;
|
}
|
else
|
{
|
toRect.width = pixelValue(options.to);
|
toRect.height = propFactor * pixelValue(options.to);
|
}
|
}
|
}
|
if (options.toggle != null) doToggle = options.toggle;
|
if (options.transition != null) kindOfTransition = options.transition;
|
if (options.fps != null) fps = options.fps;
|
}
|
|
options = {duration:durationInMilliseconds, toggle:doToggle, transition:kindOfTransition, scaleContent:doScaleContent, useCSSBox: fullCSSBox, fps: fps};
|
var sizeEffect = new Spry.Effect.Size(element, fromRect, toRect, options);
|
this.addParallelEffect(sizeEffect);
|
|
if(growFromCenter)
|
{
|
Spry.Effect.makePositioned(element);
|
|
var startOffsetPosition = new Spry.Effect.Utils.Position();
|
startOffsetPosition.x = parseInt(Spry.Effect.getStylePropRegardlessOfDisplayState(element, "left"), 10);
|
startOffsetPosition.y = parseInt(Spry.Effect.getStylePropRegardlessOfDisplayState(element, "top"), 10);
|
if (!startOffsetPosition.x) startOffsetPosition.x = 0;
|
if (!startOffsetPosition.y) startOffsetPosition.y = 0;
|
|
options = {duration:durationInMilliseconds, toggle:doToggle, transition:kindOfTransition, from: optionFrom, to: optionTo, fps: fps};
|
var fromPos = new Spry.Effect.Utils.Position;
|
fromPos.x = startOffsetPosition.x + (originalWidth - fromRect.width) / 2.0;
|
fromPos.y = startOffsetPosition.y + (originalHeight - fromRect.height) / 2.0;
|
|
var toPos = new Spry.Effect.Utils.Position;
|
toPos.x = startOffsetPosition.x + (originalWidth - toRect.width) / 2.0;
|
toPos.y = startOffsetPosition.y + (originalHeight - toRect.height) / 2.0;
|
|
var moveEffect = new Spry.Effect.Move(element, fromPos, toPos, options);
|
this.addParallelEffect(moveEffect);
|
}
|
};
|
|
Spry.Effect.Grow.prototype = new Spry.Effect.Cluster();
|
Spry.Effect.Grow.prototype.constructor = Spry.Effect.Grow;
|
|
Spry.Effect.Shake = function (element, options)
|
{
|
if (!this.notStaticAnimator)
|
return Spry.Effect.Utils.showInitError('Shake');
|
|
Spry.Effect.Cluster.call(this, options);
|
|
// toggle is not supported
|
this.options.direction = false;
|
if (this.options.toggle)
|
this.options.toggle = false;
|
|
this.name = 'Shake';
|
|
var element = Spry.Effect.getElement(element);
|
this.element = element;
|
if (!this.element)
|
return;
|
var durationInMilliseconds = 100;
|
var kindOfTransition = Spry.linearTransition;
|
var fps = 60;
|
var steps = 4;
|
|
if (options)
|
{
|
if (options.duration != null) steps = Math.ceil(this.options.duration / durationInMilliseconds) - 1;
|
if (options.fps != null) fps = options.fps;
|
if (options.transition != null) kindOfTransition = options.transition;
|
}
|
|
Spry.Effect.makePositioned(element);
|
|
var startOffsetPosition = new Spry.Effect.Utils.Position();
|
startOffsetPosition.x = parseInt(Spry.Effect.getStyleProp(element, "left"), 10);
|
startOffsetPosition.y = parseInt(Spry.Effect.getStyleProp(element, "top"), 10);
|
if (!startOffsetPosition.x) startOffsetPosition.x = 0;
|
if (!startOffsetPosition.y) startOffsetPosition.y = 0;
|
|
var centerPos = new Spry.Effect.Utils.Position;
|
centerPos.x = startOffsetPosition.x;
|
centerPos.y = startOffsetPosition.y;
|
|
var rightPos = new Spry.Effect.Utils.Position;
|
rightPos.x = startOffsetPosition.x + 20;
|
rightPos.y = startOffsetPosition.y + 0;
|
|
var leftPos = new Spry.Effect.Utils.Position;
|
leftPos.x = startOffsetPosition.x + -20;
|
leftPos.y = startOffsetPosition.y + 0;
|
|
options = {duration:Math.ceil(durationInMilliseconds / 2), toggle:false, fps: fps, transition: kindOfTransition};
|
var effect = new Spry.Effect.Move(element, centerPos, rightPos, options);
|
this.addNextEffect(effect);
|
|
options = {duration:durationInMilliseconds, toggle:false, fps:fps, transition: kindOfTransition};
|
var effectToRight = new Spry.Effect.Move(element, rightPos, leftPos, options);
|
var effectToLeft = new Spry.Effect.Move(element, leftPos, rightPos, options);
|
|
for (var i=0; i < steps; i++)
|
{
|
if (i % 2 == 0)
|
this.addNextEffect(effectToRight);
|
else
|
this.addNextEffect(effectToLeft);
|
}
|
var pos = (steps % 2 == 0) ? rightPos: leftPos;
|
|
options = {duration:Math.ceil(durationInMilliseconds / 2), toggle:false, fps: fps, transition: kindOfTransition};
|
var effect = new Spry.Effect.Move(element, pos, centerPos, options);
|
this.addNextEffect(effect);
|
};
|
Spry.Effect.Shake.prototype = new Spry.Effect.Cluster();
|
Spry.Effect.Shake.prototype.constructor = Spry.Effect.Shake;
|
Spry.Effect.Shake.prototype.doToggle = function(){};
|
|
Spry.Effect.Squish = function (element, options)
|
{
|
if (!this.notStaticAnimator)
|
return Spry.Effect.Utils.showInitError('Squish');
|
|
if (!options)
|
options = {};
|
if (!options.to)
|
options.to = '0%';
|
if (!options.from)
|
options.from = '100%';
|
|
options.growCenter = false;
|
Spry.Effect.Grow.call(this, element, options);
|
this.name = 'Squish';
|
};
|
Spry.Effect.Squish.prototype = new Spry.Effect.Grow();
|
Spry.Effect.Squish.prototype.constructor = Spry.Effect.Squish;
|
|
Spry.Effect.Pulsate = function (element, options)
|
{
|
if (!this.notStaticAnimator)
|
return Spry.Effect.Utils.showInitError('Pulsate');
|
|
Spry.Effect.Cluster.call(this, options);
|
|
// toggle is not supported
|
this.options.direction = false;
|
if (this.options.toggle)
|
this.options.toggle = false;
|
|
var element = Spry.Effect.getElement(element);
|
var originalOpacity = 0;
|
this.element = element;
|
if (!this.element)
|
return;
|
|
this.name = 'Pulsate';
|
var durationInMilliseconds = 100;
|
var fromOpacity = 100.0;
|
var toOpacity = 0.0;
|
var doToggle = false;
|
var kindOfTransition = Spry.linearTransition;
|
var fps = 60;
|
if(/MSIE/.test(navigator.userAgent))
|
originalOpacity = parseInt(Spry.Effect.getStylePropRegardlessOfDisplayState(this.element, 'filter').replace(/alpha\(opacity=([0-9]{1,3})\)/g, '$1'), 10);
|
else
|
originalOpacity = parseInt(Spry.Effect.getStylePropRegardlessOfDisplayState(this.element, 'opacity') * 100, 10);
|
|
if (isNaN(originalOpacity)){
|
originalOpacity = 100;
|
}
|
|
if (options)
|
{
|
if (options.from != null){
|
if (Spry.Effect.Utils.isPercentValue(options.from))
|
fromOpacity = Spry.Effect.Utils.getPercentValue(options.from) * originalOpacity / 100;
|
else
|
fromOpacity = options.from;
|
}
|
if (options.to != null)
|
{
|
if (Spry.Effect.Utils.isPercentValue(options.to))
|
toOpacity = Spry.Effect.Utils.getPercentValue(options.to) * originalOpacity / 100;
|
else
|
toOpacity = options.to;
|
}
|
if (options.transition != null) kindOfTransition = options.transition;
|
if (options.fps != null) fps = options.fps;
|
}
|
|
options = {duration:durationInMilliseconds, toggle:doToggle, transition:kindOfTransition, fps:fps};
|
fromOpacity = fromOpacity / 100.0;
|
toOpacity = toOpacity / 100.0;
|
|
var fadeEffect = new Spry.Effect.Opacity(element, fromOpacity, toOpacity, options);
|
var appearEffect = new Spry.Effect.Opacity(element, toOpacity, fromOpacity, options);
|
var steps = parseInt(this.options.duration / 200, 10);
|
for (var i=0; i < steps; i++){
|
this.addNextEffect(fadeEffect);
|
this.addNextEffect(appearEffect);
|
}
|
};
|
Spry.Effect.Pulsate.prototype = new Spry.Effect.Cluster();
|
Spry.Effect.Pulsate.prototype.constructor = Spry.Effect.Pulsate;
|
Spry.Effect.Pulsate.prototype.doToggle = function(){};
|
|
Spry.Effect.Puff = function (element, options)
|
{
|
if (!this.notStaticAnimator)
|
return Spry.Effect.Utils.showInitError('Puff');
|
|
Spry.Effect.Cluster.call(this, options);
|
|
var element = Spry.Effect.getElement(element);
|
this.element = element;
|
if (!this.element)
|
return;
|
this.name = 'Puff';
|
var doToggle = false;
|
var doScaleContent = false;
|
var durationInMilliseconds = 1000;
|
var kindOfTransition = Spry.fifthTransition;
|
var fps = 60;
|
|
Spry.Effect.makePositioned(element); // for move
|
|
if (options){
|
if (options.toggle != null) doToggle = options.toggle;
|
if (options.duration != null) durationInMilliseconds = options.duration;
|
if (options.transition != null) kindOfTransition = options.transition;
|
if (options.fps != null) fps = options.fps;
|
}
|
var originalRect = Spry.Effect.getDimensions(element);
|
var startWidth = originalRect.width;
|
var startHeight = originalRect.height;
|
|
options = {duration:durationInMilliseconds, toggle:doToggle, transition: kindOfTransition, fps: fps};
|
|
var fromOpacity = 1.0;
|
var toOpacity = 0.0;
|
var opacityEffect = new Spry.Effect.Opacity(element, fromOpacity, toOpacity, options);
|
this.addParallelEffect(opacityEffect);
|
|
var fromPos = Spry.Effect.getPosition(element);
|
|
var toPos = new Spry.Effect.Utils.Position;
|
toPos.x = startWidth / 2.0 * -1.0;
|
toPos.y = startHeight / 2.0 * -1.0;
|
|
options = {duration:durationInMilliseconds, toggle:doToggle, transition:kindOfTransition, from: fromPos, to: toPos, fps: fps};
|
var moveEffect = new Spry.Effect.Move(element, fromPos, toPos, options);
|
this.addParallelEffect(moveEffect);
|
|
var self = this;
|
this.addObserver({
|
onPreEffect:function(){if (self.direction == Spry.backwards){self.element.style.display = 'block';}},
|
onPostEffect: function(){if (self.direction == Spry.forwards){self.element.style.display = 'none';}}
|
});
|
};
|
Spry.Effect.Puff.prototype = new Spry.Effect.Cluster;
|
Spry.Effect.Puff.prototype.constructor = Spry.Effect.Puff;
|
|
Spry.Effect.DropOut = function (element, options)
|
{
|
if (!this.notStaticAnimator)
|
return Spry.Effect.Utils.showInitError('DropOut');
|
|
Spry.Effect.Cluster.call(this, options);
|
|
var element = Spry.Effect.getElement(element);
|
this.element = element;
|
if (!this.element)
|
return;
|
var durationInMilliseconds = 1000;
|
var fps = 60;
|
var kindOfTransition = Spry.fifthTransition;
|
var direction = Spry.forwards;
|
var doToggle = false;
|
this.name = 'DropOut';
|
|
Spry.Effect.makePositioned(element);
|
|
if (options)
|
{
|
if (options.duration != null) durationInMilliseconds = options.duration;
|
if (options.toggle != null) doToggle = options.toggle;
|
if (options.fps != null) fps = options.fps;
|
if (options.transition != null) kindOfTransition = options.transition;
|
if (options.dropIn != null) direction = -1;
|
}
|
|
var startOffsetPosition = new Spry.Effect.Utils.Position();
|
startOffsetPosition.x = parseInt(Spry.Effect.getStyleProp(element, "left"), 10);
|
startOffsetPosition.y = parseInt(Spry.Effect.getStyleProp(element, "top"), 10);
|
if (!startOffsetPosition.x) startOffsetPosition.x = 0;
|
if (!startOffsetPosition.y) startOffsetPosition.y = 0;
|
|
var fromPos = new Spry.Effect.Utils.Position;
|
fromPos.x = startOffsetPosition.x + 0;
|
fromPos.y = startOffsetPosition.y + 0;
|
|
var toPos = new Spry.Effect.Utils.Position;
|
toPos.x = startOffsetPosition.x + 0;
|
toPos.y = startOffsetPosition.y + (direction * 160);
|
|
options = {from:fromPos, to:toPos, duration:durationInMilliseconds, toggle:doToggle, transition: kindOfTransition, fps: fps};
|
var moveEffect = new Spry.Effect.Move(element, options.from, options.to, options);
|
this.addParallelEffect(moveEffect);
|
|
var fromOpacity = 1.0;
|
var toOpacity = 0.0;
|
options = {duration:durationInMilliseconds, toggle:doToggle, transition: kindOfTransition, fps: fps};
|
var opacityEffect = new Spry.Effect.Opacity(element, fromOpacity, toOpacity, options);
|
this.addParallelEffect(opacityEffect);
|
|
var self = this;
|
this.addObserver({
|
onPreEffect:function(){self.element.style.display = 'block';},
|
onPostEffect: function(){if (self.direction == Spry.forwards){self.element.style.display = 'none';}}
|
});
|
|
};
|
Spry.Effect.DropOut.prototype = new Spry.Effect.Cluster();
|
Spry.Effect.DropOut.prototype.constructor = Spry.Effect.DropOut;
|
|
Spry.Effect.Fold = function (element, options)
|
{
|
if (!this.notStaticAnimator)
|
return Spry.Effect.Utils.showInitError('Fold');
|
|
Spry.Effect.Cluster.call(this, options);
|
|
var element = Spry.Effect.getElement(element);
|
this.element = element;
|
if (!this.element)
|
return;
|
this.name = 'Fold';
|
var durationInMilliseconds = 1000;
|
var doToggle = false;
|
var doScaleContent = true;
|
var fullCSSBox = false;
|
var kindOfTransition = Spry.fifthTransition;
|
var fps = fps;
|
|
Spry.Effect.makeClipping(element);
|
|
var originalRect = Spry.Effect.getDimensionsRegardlessOfDisplayState(element);
|
var startWidth = originalRect.width;
|
var startHeight = originalRect.height;
|
|
var stopWidth = startWidth;
|
var stopHeight = startHeight / 5;
|
|
var fromRect = new Spry.Effect.Utils.Rectangle;
|
fromRect.width = startWidth;
|
fromRect.height = startHeight;
|
|
var toRect = new Spry.Effect.Utils.Rectangle;
|
toRect.width = stopWidth;
|
toRect.height = stopHeight;
|
|
if (options)
|
{
|
if (options.duration != null) durationInMilliseconds = Math.ceil(options.duration/2);
|
if (options.toggle != null) doToggle = options.toggle;
|
if (options.useCSSBox != null) fullCSSBox = options.useCSSBox;
|
if (options.fps != null) fps = options.fps;
|
if (options.transition != null) kindOfTransition = options.transition;
|
}
|
|
options = {duration:durationInMilliseconds, toggle:doToggle, scaleContent:doScaleContent, useCSSBox: fullCSSBox, transition: kindOfTransition, fps: fps};
|
var sizeEffect = new Spry.Effect.Size(element, fromRect, toRect, options);
|
this.addNextEffect(sizeEffect);
|
|
fromRect.width = toRect.width;
|
fromRect.height = toRect.height;
|
toRect.width = '0%';
|
var sizeEffect = new Spry.Effect.Size(element, fromRect, toRect, options);
|
this.addNextEffect(sizeEffect);
|
};
|
|
Spry.Effect.Fold.prototype = new Spry.Effect.Cluster();
|
Spry.Effect.Fold.prototype.constructor = Spry.Effect.Fold;
|
|
//////////////////////////////////////////////////////////////
|
// //
|
// The names of some of the static effect functions //
|
// changed in Spry 1.5. These wrappers will insure that we //
|
// remain compatible with previous versions of Spry. //
|
// //
|
//////////////////////////////////////////////////////////////
|
|
Spry.Effect.DoFade = function (element, options)
|
{
|
return Spry.Effect.Utils.DoEffect('Fade', element, options);
|
};
|
|
Spry.Effect.DoBlind = function (element, options)
|
{
|
return Spry.Effect.Utils.DoEffect('Blind', element, options);
|
};
|
|
Spry.Effect.DoHighlight = function (element, options)
|
{
|
return Spry.Effect.Utils.DoEffect('Highlight', element, options);
|
};
|
|
Spry.Effect.DoSlide = function (element, options)
|
{
|
return Spry.Effect.Utils.DoEffect('Slide', element, options);
|
};
|
|
Spry.Effect.DoGrow = function (element, options)
|
{
|
return Spry.Effect.Utils.DoEffect('Grow', element, options);
|
};
|
|
Spry.Effect.DoShake = function (element, options)
|
{
|
return Spry.Effect.Utils.DoEffect('Shake', element, options);
|
};
|
|
Spry.Effect.DoSquish = function (element, options)
|
{
|
return Spry.Effect.Utils.DoEffect('Squish', element, options);
|
};
|
|
Spry.Effect.DoPulsate = function (element, options)
|
{
|
return Spry.Effect.Utils.DoEffect('Pulsate', element, options);
|
};
|
|
Spry.Effect.DoPuff = function (element, options)
|
{
|
return Spry.Effect.Utils.DoEffect('Puff', element, options);
|
};
|
|
Spry.Effect.DoDropOut = function (element, options)
|
{
|
return Spry.Effect.Utils.DoEffect('DropOut', element, options);
|
};
|
|
Spry.Effect.DoFold = function (element, options)
|
{
|
return Spry.Effect.Utils.DoEffect('Fold', element, options);
|
};
|