/**********************************************************************
TERMS OF USE - EASING EQUATIONS
Open source under the BSD License.
Copyright (c) 2001 Robert Penner
JavaScript version copyright (C) 2006 by Philippe Maegerman
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 the author nor the names of 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.

*****************************************/
function Delegate() {}
Delegate.create = function (o, f) {
	var a = new Array() ;
	var l = arguments.length ;
	for(var i = 2 ; i < l ; i++) a[i - 2] = arguments[i] ;
	return function() {
		var aP = [].concat(arguments, a) ;
		f.apply(o, aP);
	}
}

Tween = function(obj, prop, func, begin, finish, duration, suffixe){
	this.init(obj, prop, func, begin, finish, duration, suffixe)
}
var t = Tween.prototype;

t.obj = new Object();
t.prop='';
t.func = function (t, b, c, d) { return c*t/d + b; };
t.begin = 0;
t.change = 0;
t.prevTime = 0;
t.prevPos = 0;
t.looping = false;
t._duration = 0;
t._time = 0;
t._pos = 0;
t._position = 0;
t._startTime = 0;
t._finish = 0;
t.name = '';
t.suffixe = '';
t._listeners = new Array();	
t.setTime = function(t){
	this.prevTime = this._time;
	if (t > this.getDuration()) {
		if (this.looping) {
			this.rewind (t - this._duration);
			this.update();
			this.broadcastMessage('onMotionLooped',{target:this,type:'onMotionLooped'});
		} else {
			this._time = this._duration;
			this.update();
			this.stop();
			this.broadcastMessage('onMotionFinished',{target:this,type:'onMotionFinished'});
		}
	} else if (t < 0) {
		this.rewind();
		this.update();
	} else {
		this._time = t;
		this.update();
	}
}
t.getTime = function(){
	return this._time;
}
t.setDuration = function(d){
	this._duration = (d == null || d <= 0) ? 100000 : d;
}
t.getDuration = function(){
	return this._duration;
}
t.setPosition = function(p){
	this.prevPos = this._pos;
	var a = this.suffixe != '' ? this.suffixe : '';
	this.obj[this.prop] = Math.round(p) + a;
	this._pos = p;
	this.broadcastMessage('onMotionChanged',{target:this,type:'onMotionChanged'});
}
t.getPosition = function(t){
	if (t == undefined) t = this._time;
	return this.func(t, this.begin, this.change, this._duration);
};
t.setFinish = function(f){
	this.change = f - this.begin;
};
t.getFinish = function(){
	return this.begin + this.change;
};
t.init = function(obj, prop, func, begin, finish, duration, suffixe){
	if (!arguments.length) return;
	this._listeners = new Array();
	this.addListener(this);
	if(suffixe) this.suffixe = suffixe;
	this.obj = obj;
	this.prop = prop;
	this.begin = begin;
	this._pos = begin;
	this.setDuration(duration);
	if (func!=null && func!='') {
		this.func = func;
	}
	this.setFinish(finish);
}
t.start = function(){
	this.rewind();
	this.startEnterFrame();
	this.broadcastMessage('onMotionStarted',{target:this,type:'onMotionStarted'});
	//alert('in');
}
t.rewind = function(t){
	this.stop();
	this._time = (t == undefined) ? 0 : t;
	this.fixTime();
	this.update();
}
t.fforward = function(){
	this._time = this._duration;
	this.fixTime();
	this.update();
}
t.update = function(){
	this.setPosition(this.getPosition(this._time));
	}
t.startEnterFrame = function(){
	this.stopEnterFrame();
	this.isPlaying = true;
	this.onEnterFrame();
}
t.onEnterFrame = function(){
	if(this.isPlaying) {
		this.nextFrame();
		setTimeout(Delegate.create(this, this.onEnterFrame), 0);
	}
}
t.nextFrame = function(){
	this.setTime((this.getTimer() - this._startTime) / 1000);
	}
t.stop = function(){
	this.stopEnterFrame();
	this.broadcastMessage('onMotionStopped',{target:this,type:'onMotionStopped'});
}
t.stopEnterFrame = function(){
	this.isPlaying = false;
}

t.continueTo = function(finish, duration){
	this.begin = this._pos;
	this.setFinish(finish);
	if (this._duration != undefined)
		this.setDuration(duration);
	this.start();
}
t.resume = function(){
	this.fixTime();
	this.startEnterFrame();
	this.broadcastMessage('onMotionResumed',{target:this,type:'onMotionResumed'});
}
t.yoyo = function (){
	this.continueTo(this.begin,this._time);
}

t.addListener = function(o){
	this.removeListener (o);
	return this._listeners.push(o);
}
t.removeListener = function(o){
	var a = this._listeners;	
	var i = a.length;
	while (i--) {
		if (a[i] == o) {
			a.splice (i, 1);
			return true;
		}
	}
	return false;
}
t.broadcastMessage = function(){
	var arr = new Array();
	for(var i = 0; i < arguments.length; i++){
		arr.push(arguments[i])
	}
	var e = arr.shift();
	var a = this._listeners;
	var l = a.length;
	for (var i=0; i<l; i++){
		if(a[i][e])
		a[i][e].apply(a[i], arr);
	}
}
t.fixTime = function(){
	this._startTime = this.getTimer() - this._time * 1000;
}
t.getTimer = function(){
	return new Date().getTime() - this._time;
}
Tween.backEaseIn = function(t,b,c,d,a,p){
	if (s == undefined) var s = 1.70158;
	return c*(t/=d)*t*((s+1)*t - s) + b;
}
Tween.backEaseOut = function(t,b,c,d,a,p){
	if (s == undefined) var s = 1.70158;
	return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
}
Tween.backEaseInOut = function(t,b,c,d,a,p){
	if (s == undefined) var s = 1.70158; 
	if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
	return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
}
Tween.elasticEaseIn = function(t,b,c,d,a,p){
		if (t==0) return b;  
		if ((t/=d)==1) return b+c;  
		if (!p) p=d*.3;
		if (!a || a < Math.abs(c)) {
			a=c; var s=p/4;
		}
		else 
			var s = p/(2*Math.PI) * Math.asin (c/a);
		
		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	
}
Tween.elasticEaseOut = function (t,b,c,d,a,p){
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (!a || a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return (a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b);
	}
Tween.elasticEaseInOut = function (t,b,c,d,a,p){
	if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) var p=d*(.3*1.5);
	if (!a || a < Math.abs(c)) {var a=c; var s=p/4; }
	else var s = p/(2*Math.PI) * Math.asin (c/a);
	if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
}

Tween.bounceEaseOut = function(t,b,c,d){
	if ((t/=d) < (1/2.75)) {
		return c*(7.5625*t*t) + b;
	} else if (t < (2/2.75)) {
		return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
	} else if (t < (2.5/2.75)) {
		return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
	} else {
		return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
	}
}
Tween.bounceEaseIn = function(t,b,c,d){
	return c - Tween.bounceEaseOut (d-t, 0, c, d) + b;
	}
Tween.bounceEaseInOut = function(t,b,c,d){
	if (t < d/2) return Tween.bounceEaseIn (t*2, 0, c, d) * .5 + b;
	else return Tween.bounceEaseOut (t*2-d, 0, c, d) * .5 + c*.5 + b;
	}

Tween.strongEaseInOut = function(t,b,c,d){
	return c*(t/=d)*t*t*t*t + b;
	}

Tween.regularEaseIn = function(t,b,c,d){
	return c*(t/=d)*t + b;
	}
Tween.regularEaseOut = function(t,b,c,d){
	return -c *(t/=d)*(t-2) + b;
	}

Tween.regularEaseInOut = function(t,b,c,d){
	if ((t/=d/2) < 1) return c/2*t*t + b;
	return -c/2 * ((--t)*(t-2) - 1) + b;
	}
Tween.strongEaseIn = function(t,b,c,d){
	return c*(t/=d)*t*t*t*t + b;
	}
Tween.quickEaseIn = function(t,b,c,d){
	return c*(t/=d)*t*t*t*t*t*t*t*t*t*t*t + b;
	}
Tween.strongEaseOut = function(t,b,c,d){
	return c*((t=t/d-1)*t*t*t*t + 1) + b;
	}

Tween.strongEaseInOut = function(t,b,c,d){
	if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
	return c/2*((t-=2)*t*t*t*t + 2) + b;
	}
	
/////////////////////////////////////////////////////////////////////////
// Text

TextTween.prototype = new Tween();
TextTween.prototype.constructor = Tween;
TextTween.superclass = Tween.prototype;

function TextTween(obj,property,txt,func,duration){
	this.targetObject = obj;
	this.targetProperty = property;
	this.txt = txt;
	if (func!=null && func!='') {
		this.func = func;
	}
	this.init(new Object(),'x',func,0,txt.length,duration);
}
var o = TextTween.prototype;
o.targetObject = {};
o.targetProperty = {};
o.fromColor = '';
o.toColor = '';
o.currentColor = '';
o.onMotionChanged = function(evt){
	var v = evt.target._pos;
	this.targetObject[this.targetProperty] = this.txt.substr(0,v);	
}

/////////////////////////////////////////////////////////////////////////
// Color

ColorTween.prototype = new Tween();
ColorTween.prototype.constructor = Tween;
ColorTween.superclass = Tween.prototype;

function ColorTween(obj,prop,func,fromColor,toColor,duration){
	this.targetObject = obj;
	this.targetProperty = prop;	
	this.fromColor = fromColor;
	this.toColor = toColor;
	this.init(new Object(),'x',func,0,100,duration);
	this.listenerObj = new Object();
	this.listenerObj.onMotionChanged = Delegate.create(this,this.onColorChanged);
	this.addListener(this.listenerObj);
}
var o = ColorTween.prototype;
o.targetObject = {};
o.targetProperty = {};
o.fromColor = '';
o.toColor = '';
o.currentColor = '';
o.listenerObj = {};
o.onColorChanged = function(){
	this.currentColor = this.getColor(this.fromColor,this.toColor,this._pos);
	this.targetObject[this.targetProperty] = this.currentColor;
}

/***********************************************
*
* Function    : getColor
*
* Parameters  :    start - the start color (in the form "RRGGBB" e.g. "FF00AC")
*            end - the end color (in the form "RRGGBB" e.g. "FF00AC")
*            percent - the percent (0-100) of the fade between start & end
*
* returns      : color in the form "#RRGGBB" e.g. "#FA13CE"
*
* Description : This is a utility function. Given a start and end color and
*            a percentage fade it returns a color in between the 2 colors
*
* Author      : www.JavaScript-FX.com
*
*************************************************/ 
o.getColor = function(start, end, percent)
{
	var r1=this.hex2dec(start.slice(0,2));
    var g1=this.hex2dec(start.slice(2,4));
    var b1=this.hex2dec(start.slice(4,6));

    var r2=this.hex2dec(end.slice(0,2));
    var g2=this.hex2dec(end.slice(2,4));
    var b2=this.hex2dec(end.slice(4,6));

    var pc = percent/100;

    r= Math.floor(r1+(pc*(r2-r1)) + .5);
    g= Math.floor(g1+(pc*(g2-g1)) + .5);
    b= Math.floor(b1+(pc*(b2-b1)) + .5);

    return("#" + this.dec2hex(r) + this.dec2hex(g) + this.dec2hex(b));
}
/*** These are the simplest HEX/DEC conversion routines I could come up with ***/
/*** I have seen a lot of fade routines that seem to make this a             ***/
/*** very complex task. I am sure somene else must've had this idea          ***/
/************************************************/  

o.dec2hex = function(dec){return(this.hexDigit[dec>>4]+this.hexDigit[dec&15]);}
o.hexDigit=new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F");
o.hex2dec = function(hex){return(parseInt(hex,16))};

/////////////////////////////////////////////////////////////////////////
// Opacity

OpacityTween.prototype = new Tween();
OpacityTween.prototype.constructor = Tween;
OpacityTween.superclass = Tween.prototype;

function OpacityTween(obj,func,fromOpacity,toOpacity,duration){
	this.targetObject = obj;
	this.toOpacity = toOpacity;
	
	this.init(new Object(),'x',func,fromOpacity,toOpacity,duration);
}
var o = OpacityTween.prototype;
o.targetObject = {};
o.onMotionChanged = function(evt){
	var v = evt.target._pos;
	var t = this.targetObject;
	if (t.style['opacity'] != null)
	{
		if (t.style['opacity'] == "")
			t.style['opacity'] = 0.0;
		if (t.style['opacity'] != this.toOpacity)
			t.style['opacity'] = v / 100;	
	}
	if (t.style['-moz-opacity'] != null)
	{
		if (t.style['-moz-opacity'] == "")
			t.style['-moz-opacity'] = 0.0;
		if (t.style['-moz-opacity'] != this.toOpacity)
			t.style['-moz-opacity'] = v / 100;
	}
	if(t.filters)
	{
		if (t.filters.alpha['opacity'] == "")
			t.filters.alpha['opacity'] = 0.0;
		if (t.filters.alpha['opacity'] != this.toOpacity)
			 t.filters.alpha['opacity'] = v;
	}
}

/////////////////////////////////////////////////////////////////////////
// Move

MoveTween.prototype = new Tween();
MoveTween.prototype.constructor = Tween;
MoveTween.superclass = Tween.prototype;

function MoveTween(obj,func,fromX,fromY,toX,toY,duration){
	this.targetObject = obj;
	this.fromX = fromX;
	this.fromY = fromY;
	this.toX = toX;
	this.toY = toY;
	this.posX = fromX;
	this.posY = fromY;
	this.dx = 1;
	this.dy = 1;
	if (toX < fromX)
		this.dx = -1;
	if (toY < fromY)
		this.dy = -1;	
	this.dist = Math.abs(toX - fromX);
	if (Math.abs(toY - fromY) > this.dist)
		this.dist = Math.abs(toY - fromY);
	this.dist = Math.abs(this.dist);
	
	this.init(new Object(),'x',func,0,this.dist,duration);
}
var o = MoveTween.prototype;
o.targetObject = {};
o.onMotionChanged = function(evt){
	var v = evt.target._pos;
	var t = this.targetObject;
	var p = v / this.dist;
	var d1 = Math.abs(this.toX -this.fromX);
	var d2 = Math.abs(this.toY -this.fromY);
	
	if (p)
	{
		this.posX = this.fromX + (d1 * p * this.dx);
		this.posY = this.fromY + (d2 * p * this.dy);
	}	
	t.style['left'] = this.posX;
	t.style['top'] = this.posY;
}

/////////////////////////////////////////////////////////////////////////
// Resize

ResizeTween.prototype = new Tween();
ResizeTween.prototype.constructor = Tween;
ResizeTween.superclass = Tween.prototype;

function ResizeTween(obj,func,from,to,duration){
	this.targetObject = obj;
	this.fromWX;
	this.fromWY;
	this.toWX;
	this.toWY;
	this.sizeWX;
	this.sizeWY;
	
	this.fromWX = obj.offsetWidth * from/100;
	this.fromWY = obj.offsetHeight * from/100;
	
	this.toWX = obj.offsetWidth * to/100;
	this.toWY = obj.offsetHeight * to/100;
	
	this.sizeWX = this.fromWX;
	this.sizeWY = this.fromWY;
	
	this.dist = Math.abs(this.toWX - this.fromWX);
	if (Math.abs(this.toWY - this.fromWY) > this.dist)
		this.dist = Math.abs(this.toWY - this.fromWY);
	this.dist = Math.abs(this.dist);
	this.init(new Object(),'x',func,0,this.dist,duration);
}
var o = ResizeTween.prototype;
o.targetObject = {};
o.onMotionChanged = function(evt){
	var v = evt.target._pos;
	var t = this.targetObject;
	var p = v / this.dist;
	var d1 = Math.abs(this.toWX - this.fromWX);
	var d2 = Math.abs(this.toWY - this.fromWY);
	
	if (p)
	{
		this.sizeWX = d1 * p;
		this.sizeWY = d2 * p;
	}	
	t.style['width'] = this.sizeWX;
	t.style['height'] = this.sizeWY;
}

/////////////////////////////////////////////////////////////////////////
// Stretch

StretchTween.prototype = new Tween();
StretchTween.prototype.constructor = Tween;
StretchTween.superclass = Tween.prototype;

function StretchTween(obj,func,from,to,duration){
	this.targetObject = obj;
	this.fromWY;
	this.toWY;
	this.sizeWY;
	this.sizeWX;
	this.fromWX;
	this.toWX;
	
	this.fromWY = obj.offsetHeight * from/100;
	this.toWY = obj.offsetHeight * to/100;
	
	this.fromWX = obj.offsetWidth * from/100;
	this.toWX = obj.offsetWidth * to/100;
	
	this.sizeWY = this.fromWY;
	this.sizeWX = this.fromWX;
		
	this.dist = Math.abs(this.toWY - this.fromWY);
	this.dist = Math.abs(this.dist);
	
	this.init(new Object(),'x',func,0,this.dist,duration);
}
var o = StretchTween.prototype;
o.targetObject = {};
o.onMotionChanged = function(evt){
	var v = evt.target._pos;
	var t = this.targetObject;
	var p = v / this.dist;
	var d1 = Math.abs(this.toWX - this.fromWX);
	var d2 = Math.abs(this.toWY - this.fromWY);
	
	if (p)
	{
		this.sizeWY = this.fromWY  + d2 * p;
		this.sizeWX = this.fromWX  + d1 * p;
	}	
	t.style.height = this.sizeWY;
	t.style.width = this.sizeWX;
}

/////////////////////////////////////////////////////////////////////////
// Contract

ContractTween.prototype = new Tween();
ContractTween.prototype.constructor = Tween;
ContractTween.superclass = Tween.prototype;

function ContractTween(obj,func,from,to,duration){
	this.targetObject = obj;
	this.fromWY;
	this.toWY;
	this.sizeWY;
	this.sizeWX;
	this.fromWX;
	this.toWX;
	
	this.fromWY = obj.offsetHeight * from/100;
	this.toWY = obj.offsetHeight * to/100;
	
	this.fromWX = obj.offsetWidth * from/100;
	this.toWX = obj.offsetWidth * to/100;
	
	this.sizeWY = this.fromWY;
	this.sizeWX = this.fromWX;
		
	this.dist = Math.abs(this.toWY - this.fromWY);
	this.dist = Math.abs(this.dist);
	
	this.init(new Object(),'x',func,0,this.dist,duration);
}
var o = ContractTween.prototype;
o.targetObject = {};
o.onMotionChanged = function(evt){
	var v = evt.target._pos;
	var t = this.targetObject;
	var p = v / this.dist;
	var d1 = Math.abs(this.toWX - this.fromWX);
	var d2 = Math.abs(this.toWY - this.fromWY);
	
	if (p)
	{
		this.sizeWY = this.fromWY  - d2 * p;
		this.sizeWX = this.fromWX  - d1 * p;
	}	
	t.style.height = this.sizeWY;
	t.style.width = this.sizeWX;
}

/////////////////////////////////////////////////////////////////////////
// Expand

ExpandTween.prototype = new Tween();
ExpandTween.prototype.constructor = Tween;
ExpandTween.superclass = Tween.prototype;

function ExpandTween(obj,func,from,to,duration){
	this.targetObject = obj;
	this.fromWX;
	this.fromWY;
	this.toWX;
	this.toWY;
	this.sizeWX;
	this.sizeWY;
	this.centerWX;
	this.centerWY;
	
	var w = obj.width;
	var h = obj.height;
	
	// Calc the size in case the image is not quite rendered which can effect the obj width
	if (obj.offsetWidth > w) w = obj.offsetWidth;
	if (obj.offsetHeight > h) h = obj.offsetHeight;
	
	// use to maxWidth and maxHeight to store for next time
	if (!obj.maxWidth)
		obj.maxWidth = w;
	if (!obj.maxHeight)
		obj.maxHeight = w;
		
	if (obj.maxWidth)
	{
		if (w < obj.maxWidth)
			w = obj.maxWidth;
	}
	if (obj.maxHeight)
	{
		if (h < obj.maxHeight)
			h = obj.maxHeight;
	}
	if (!obj.content)
	{
		// use to content to store the orginal top left position
		obj.content = obj.style.top + ":" + obj.style.left;
	}
	else
	{
		var p = obj.content.indexOf(":");
		if (p > 0)
		{
			obj.style.top = parseInt(obj.content.substr(0,p-1));
			obj.style.left = parseInt(obj.content.substr(p+1));
		}
	}
	this.fromWX = w * from/100;
	this.fromWY = h * from/100;
	
	this.toWX = w * to/100;
	this.toWY = h * to/100;
	
	this.sizeWX = this.fromWX;
	this.sizeWY = this.fromWY;
	
	
	this.centerWX = parseInt(obj.style.left) + w / 2 
	this.centerWY = parseInt(obj.style.top) + h / 2 
	
	this.dist = Math.abs(this.toWX - this.fromWX);
	if (Math.abs(this.toWY - this.fromWY) > this.dist)
		this.dist = Math.abs(this.toWY - this.fromWY);
	this.dist = Math.abs(this.dist);
	if (to > from)
		this.init(new Object(),'x',func,0,this.dist,duration);
	if (to < from)
		this.init(new Object(),'x',func,this.dist,0,duration);
}
var o = ExpandTween.prototype;
o.targetObject = {};
o.onMotionChanged = function(evt){
	var v = evt.target._pos;
	var t = this.targetObject;
	var p = v / this.dist;
	var d1 = Math.abs(this.toWX - this.fromWX);
	var d2 = Math.abs(this.toWY - this.fromWY);
	
	if (p)
	{
		this.sizeWX = d1 * p;
		this.sizeWY = d2 * p;
	}
	t.style['left'] = this.centerWX - (this.sizeWX/2);
	t.style['top'] = this.centerWY - (this.sizeWY/2);
	t.style['width'] = this.sizeWX;
	t.style['height'] = this.sizeWY;
	if (t.style.display)
	{
		if (t.style.display == 'none')
		{
			t.style.display = 'block';
		}
	}
	if (t.style.visibility)
	{
		if (t.style.visibility == 'hidden')
		{
			t.style.visibility = 'visible';
		}
	}
}

/////////////////////////////////////////////////////////////////////////
// Task

TaskTween.prototype = new Tween();
TaskTween.prototype.constructor = Tween;
TaskTween.superclass = Tween.prototype;

function TaskTween(obj,sCommand,sValue,duration){
	this.targetObject = obj;
	this.sCommand = sCommand;
	this.sValue = sValue;
	this.bDone = false;
	
	this.sCommand = this.sCommand.toLowerCase();
	this.init(new Object(),'x',Tween.regularEaseIn,0,100,duration);
}
var o = TaskTween.prototype;
o.targetObject = {};
o.onMotionChanged = function(evt){
	var v = evt.target._pos;
	var t = this.targetObject;

	if (!this.bDone && v == 100)
	{
		switch(this.sCommand)
		{
			case "show":
				t.style.display = "block";										
				break;
			case "hide":
				t.style.display = "none";										
				break;
			case "setorder":
				var nOrder = parseInt(this.sValue);
				t.style.zIndex = nOrder;
				break;
			case "execute":
				eval(this.sValue);
				break;
			case "startscrolling":
				t.sc.start();
				break;
			case "stopscrolling":
				t.sc.stop();
				t.sc.rewind();
				break;
		}
		this.bDone = true;
	}
}

/////////////////////////////////////////////////////////////////////////
// Parallel

function Delegate() {}
Delegate.create = function (o, f) {
	var a = new Array() ;
	var l = arguments.length ;
	for(var i = 2 ; i < l ; i++) a[i - 2] = arguments[i] ;
	return function() {
		var aP = [].concat(arguments, a) ;
		f.apply(o, aP);
	}
}
function Parallel(){
	this.children = new Array();
	this.numChildren = 0;
	this._listeners = new Array();
	this.addListener(this);
}
var s = Parallel.prototype;
s.endObject = new Object();
s.addChild = function(tween){
	this.children.push(tween)
	this.numChildren++;
}
s.start = function(){
	this.play();
	this.broadcastMessage('onMotionStarted', {target:this, type:'onMotionStarted'});
}
s.play = function(){
	for(var u = 0; u < this.numChildren; u++){
		if(u==(this.numChildren-1)){
			this.endObject = new Object();
			this.endObject.onMotionFinished = Delegate.create(this, this.end);
			this.children[u].addListener(this.endObject);
		}
		this.children[u].start();
	}
}

s.end = function(){
	this.children[this.numChildren-1].removeListener(this.endObject);
	this.broadcastMessage('onMotionFinished', {target:this, type:'onMotionFinished'});
}
s.stop = function(){
	this.enumAction('stop');
	this.broadcastMessage('onMotionStopped', {target:this, type:'onMotionStopped'});
	}
s.rewind = function(){
	this.enumAction('rewind');
	}
s.fforward = function(){
	this.enumAction('fforward');
	}
s.resume = function(){
	this.enumAction('resume');
	this.broadcastMessage('onMotionResumed', {target:this, type:'onMotionResumed'});
	}
s.yoyo = function(){
	this.enumAction('yoyo');
	}


s.enumAction = function(action){
	for(var u = 0; u < this.numChildren; u++){
		this.children[u][action]();
	}
}

s.addListener = function(o){
	this.removeListener (o);
	return this._listeners.push(o);

}
s.removeListener = function(o){
	var a = this._listeners;	
	var i = a.length;
	while (i--) {
		if (a[i] == o) {
			a.splice (i, 1);
			return true;
		}
	}
	return false;
}
s.broadcastMessage = function(){
	var arr = new Array();
	for(var i = 0; i < arguments.length; i++){
		arr.push(arguments[i])
	}
	var e = arr.shift();
	var a = this._listeners;
	var l = a.length;
	for (var i=0; i<l; i++){
		if(a[i][e])
		a[i][e].apply(a[i], arr);
	}
}

/////////////////////////////////////////////////////////////////////////
// Sequence

function Delegate() {}
Delegate.create = function (o, f) {
	var a = new Array() ;
	var l = arguments.length ;
	for(var i = 2 ; i < l ; i++) a[i - 2] = arguments[i] ;
	return function() {
		var aP = [].concat(arguments, a) ;
		f.apply(o, aP);
	}
}
function Sequence(){
	this.children = new Array();
	this.currentChildIndex = 0;
	this._listeners = new Array();
	this.nextObject = new Object();
	this.addListener(this);
}
var s = Sequence.prototype;
s.addChild = function(tween){
	this.children.push(tween)
}
s.removeChild = function(tween){
	var a = this.children;	
	var i = a.length;
	while (i--) {
		if (a[i] == tween) {
			a.splice (i, 1);
			return true;
		}
	}
	return false;
}
s.start = function(){
	this.rewind();
	this.play();
	this.broadcastMessage('onMotionStarted',{target:this,type:'onMotionStarted'});
}
s.next = function(){
	this.children[this.currentChildIndex].removeListener(this.nextObject);
	if(this.currentChildIndex < this.children.length-1){
		this.currentChildIndex++;
		this.play();
	}
	else{
		this.stop();
		this.broadcastMessage('onMotionFinished',{target:this,type:'onMotionFinished'});
	}
}
s.play = function(){
	this.nextObject = new Object();
	this.nextObject.onMotionFinished = Delegate.create(this, this.next);
	this.children[this.currentChildIndex].addListener(this.nextObject);
	this.children[this.currentChildIndex].start();
}
s.stop = function(){
	this.children[this.currentChildIndex].stop();
	this.broadcastMessage('onMotionStopped',{target:this,type:'onMotionStopped'});
}
s.rewind = function(){
	this.children[this.currentChildIndex].removeListener(this.nextObject);
	this.currentChildIndex = 0;
	for(var i = 0; i < this.children.length; i++){
		this.children[i].rewind();
	}
}
s.fforward = function(){
	this.children[this.currentChildIndex].removeListener(this.nextObject);
	for(var i = 0; i < this.children.length; i++){
		this.children[i].fforward();
	}
	this.currentChildIndex = this.children.length - 1;
}
s.resume = function(){
	this.children[this.currentChildIndex].resume();
	this.broadcastMessage('onMotionResumed',{target:this,type:'onMotionStopped'});
}
s.addListener = function(o){
	this.removeListener (o);
	return this._listeners.push(o);

}
s.removeListener = function(o){
	var a = this._listeners;	
	var i = a.length;
	while (i--) {
		if (a[i] == o) {
			a.splice (i, 1);
			return true;
		}
	}
	return false;
}
s.broadcastMessage = function(){
	var arr = new Array();
	for(var i = 0; i < arguments.length; i++){
		arr.push(arguments[i])
	}
	var e = arr.shift();
	var a = this._listeners;
	var l = a.length;
	for (var i=0; i<l; i++){
		if(a[i][e])
		a[i][e].apply(a[i], arr);
	}
}

///////////////////////////////////////////////////////////////////////////////////
// popup dialog functions 

// global variables //
var TIMER = 5;
var SPEED = 15;

// calculate the current window width //
function pageWidth() {
  return window.innerWidth != null ? window.innerWidth : document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body != null ? document.body.clientWidth : null;
}

// calculate the current window height //
function pageHeight() {
  return window.innerHeight != null? window.innerHeight : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body != null? document.body.clientHeight : null;
}

// calculate the current window vertical offset //
function topPosition() {
  return typeof window.pageYOffset != 'undefined' ? window.pageYOffset : document.documentElement && document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ? document.body.scrollTop : 0;
}

// calculate the position starting at the left of the window //
function leftPosition() {
  return typeof window.pageXOffset != 'undefined' ? window.pageXOffset : document.documentElement && document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ? document.body.scrollLeft : 0;
}

///////////////////////////////////////////////////////////////////////////////////
// Main dialdg functions 

// build/show the dialog box, populate the data and call the fadeDialog function //
function showDialog(title,message,type,autohide,toppos,leftpos) {
  if(!type) {
    type = 'error';
  }
  var dialog;
  var dialogheader;
  var dialogclose;
  var dialogtitle;
  var dialogcontent;
  var dialogmask;
  if(!document.getElementById('nxdialog')) {
    dialog = document.createElement('div');
    dialog.id = 'nxdialog';
    dialogheader = document.createElement('div');
    dialogheader.id = 'nxdialog-header';
    dialogtitle = document.createElement('div');
    dialogtitle.id = 'nxdialog-title';
    dialogclose = document.createElement('div');
    dialogclose.id = 'nxdialog-close'
    dialogcontent = document.createElement('div');
    dialogcontent.id = 'nxdialog-content';

    dialogmask = document.createElement('div');
    dialogmask.id = 'nxdialog-mask';
    document.body.appendChild(dialogmask);


    document.body.appendChild(dialog);
    dialog.appendChild(dialogheader);
    dialogheader.appendChild(dialogtitle);
    dialogheader.appendChild(dialogclose);
    dialog.appendChild(dialogcontent);;
    dialogclose.setAttribute('onclick','hideDialog()');
    dialogclose.onclick = hideDialog;
  } else {
    dialog = document.getElementById('nxdialog');
    dialogheader = document.getElementById('nxdialog-header');
    dialogtitle = document.getElementById('nxdialog-title');
    dialogclose = document.getElementById('nxdialog-close');
    dialogcontent = document.getElementById('nxdialog-content');
    dialogmask = document.getElementById('nxdialog-mask');
    dialogmask.style.visibility = "visible";
    dialog.style.visibility = "visible";
  }
  dialog.style.opacity = .00;
  dialog.style.filter = 'alpha(opacity=0)';
  dialog.alpha = 0;
  var width = pageWidth();
  var height = pageHeight();
  var left = leftPosition();
  var top = topPosition();
  var dialogwidth = dialog.offsetWidth;
  var dialogheight = dialog.offsetHeight;
  var topposition = top + (height / 3) - (dialogheight / 2);
  var leftposition = left + (width / 2) - (dialogwidth / 2);
  dialog.style.top = topposition + "px";
  if(toppos)
	  dialog.style.top = toppos;
  dialog.style.left = leftposition + "px";
  if(leftpos)
	  dialog.style.left = leftpos;
  dialogheader.className = type + "header";
  dialogtitle.innerHTML = title;
  dialogcontent.className = type;
  dialogcontent.innerHTML = message;

  dialogmask.style.height = pageHeight();
  
  dialog.timer = setInterval("fadeDialog(1)", TIMER);
  if(autohide) {
    dialogclose.style.visibility = "hidden";
    window.setTimeout("hideDialog()", (autohide * 1000));
  } else {
    dialogclose.style.visibility = "visible";
  }
}

// hide the dialog box //
function hideDialog() {
  var dialog = document.getElementById('nxdialog');
  if (dialog == null)
  	return;
  if (dialog.timer != null)
  {
	 clearInterval(dialog.timer);
  }
  dialog.timer = setInterval("fadeDialog(0)", TIMER);  	
}

// fade-in the dialog box //
function fadeDialog(flag) {
  if(flag == null) {
    flag = 1;
  }
  var dialog = document.getElementById('nxdialog');
  var value;
  if(flag == 1) {
    value = dialog.alpha + SPEED;
  } else {
    value = dialog.alpha - SPEED;
  }
  dialog.alpha = value;
  dialog.style.opacity = (value / 100);
  dialog.style.filter = 'alpha(opacity=' + value + ')';
  if(value >= 99) {
    clearInterval(dialog.timer);
    dialog.timer = null;
  } else if(value <= 1) {
    dialog.style.visibility = "hidden";
    document.getElementById('nxdialog-mask').style.visibility = "hidden";
    clearInterval(dialog.timer);
  }
}

///////////////////////////////////////////////////////////////////////////////////
// Second dialog functions 

// build/show the dialog box, populate the data and call the fadeDialog function //
function showDialog2(title,message,type,autohide,toppos,leftpos) {
  if(!type) {
    type = 'error';
  }
  var dialog;
  var dialogheader;
  var dialogclose;
  var dialogtitle;
  var dialogcontent;
  var dialogmask;
  if(!document.getElementById('nxdialog2')) {
    dialog = document.createElement('div');
    dialog.id = 'nxdialog2';
    dialogheader = document.createElement('div');
    dialogheader.id = 'nxdialog2-header';
    dialogtitle = document.createElement('div');
    dialogtitle.id = 'nxdialog2-title';
    dialogclose = document.createElement('div');
    dialogclose.id = 'nxdialog2-close'
    dialogcontent = document.createElement('div');
    dialogcontent.id = 'nxdialog2-content';

    dialogmask = document.createElement('div');
    dialogmask.id = 'nxdialog2-mask';
    document.body.appendChild(dialogmask);


    document.body.appendChild(dialog);
    dialog.appendChild(dialogheader);
    dialogheader.appendChild(dialogtitle);
    dialogheader.appendChild(dialogclose);
    dialog.appendChild(dialogcontent);;
    dialogclose.setAttribute('onclick','hideDialog2()');
    dialogclose.onclick = hideDialog2;
  } else {
    dialog = document.getElementById('nxdialog2');
    dialogheader = document.getElementById('nxdialog2-header');
    dialogtitle = document.getElementById('nxdialog2-title');
    dialogclose = document.getElementById('nxdialog2-close');
    dialogcontent = document.getElementById('nxdialog2-content');
    dialogmask = document.getElementById('nxdialog2-mask');
    dialogmask.style.visibility = "visible";
    dialog.style.visibility = "visible";
  }
  dialog.style.opacity = .00;
  dialog.style.filter = 'alpha(opacity=0)';
  dialog.alpha = 0;
  var width = pageWidth();
  var height = pageHeight();
  var left = leftPosition();
  var top = topPosition();
  var dialogwidth = dialog.offsetWidth;
  var dialogheight = dialog.offsetHeight;
  var topposition = top + (height / 3) - (dialogheight / 2);
  var leftposition = left + (width / 2) - (dialogwidth / 2);
  dialog.style.top = topposition + "px";
  if(toppos)
	  dialog.style.top = toppos;
  dialog.style.left = leftposition + "px";
  if(leftpos)
	  dialog.style.left = leftpos;
  dialogheader.className = type + "header";
  dialogtitle.innerHTML = title;
  dialogcontent.className = type;
  dialogcontent.innerHTML = message;

  dialogmask.style.height = pageHeight();
  
  dialog.timer = setInterval("fadeDialog2(1)", TIMER);
  if(autohide) {
    dialogclose.style.visibility = "hidden";
    window.setTimeout("hideDialog2()", (autohide * 1000));
  } else {
    dialogclose.style.visibility = "visible";
  }
}

// hide the second dialog box //
function hideDialog2(vAutoHideFirstDialog) 
{
  var dialog = document.getElementById('nxdialog2');
  if (dialog == null)
  	return;
  
  if (vAutoHideFirstDialog == null)
  	vAutoHideFirstDialog = 0;
  if (dialog == null && vAutoHideFirstDialog)
  {
  	hideDialog();
  	return;
  }
  if (dialog.timer != null)
  {
	clearInterval(dialog.timer);
  }
  dialog.timer = setInterval("fadeDialog2(0," + vAutoHideFirstDialog + ")", TIMER);
}

// fade-in the second dialog box //
function fadeDialog2(flag,vAutoHideFirstDialog) {
  if(flag == null) {
    flag = 1;
  }
  if(vAutoHideFirstDialog == null) {
    vAutoHideFirstDialog = 0;
  }  
  var dialog = document.getElementById('nxdialog2');
  var value;
  if(flag == 1) {
    value = dialog.alpha + SPEED;
  } else {
    value = dialog.alpha - SPEED;
  }
  dialog.alpha = value;
  dialog.style.opacity = (value / 100);
  dialog.style.filter = 'alpha(opacity=' + value + ')';
  if(value >= 99) {
	if (dialog.timer)
  	{
    	clearInterval(dialog.timer);
  	}
    dialog.timer = null;
  } else if(value <= 1) {
    dialog.style.visibility = "hidden";
    document.getElementById('nxdialog2-mask').style.visibility = "hidden";
    clearInterval(dialog.timer);
    if (vAutoHideFirstDialog)
    	hideDialog();
  }
}


///////////////////////////////////////////////////////////////////////////////////
// Third dialog functions 

// build/show the dialog box, populate the data and call the fadeDialog function //
function showDialog3(title,message,type,autohide,toppos,leftpos) {
  if(!type) {
    type = 'error';
  }
  var dialog;
  var dialogheader;
  var dialogclose;
  var dialogtitle;
  var dialogcontent;
  var dialogmask;
  if(!document.getElementById('nxdialog3')) {
    dialog = document.createElement('div');
    dialog.id = 'nxdialog3';
    dialogheader = document.createElement('div');
    dialogheader.id = 'nxdialog3-header';
    dialogtitle = document.createElement('div');
    dialogtitle.id = 'nxdialog3-title';
    dialogclose = document.createElement('div');
    dialogclose.id = 'nxdialog3-close'
    dialogcontent = document.createElement('div');
    dialogcontent.id = 'nxdialog3-content';

    dialogmask = document.createElement('div');
    dialogmask.id = 'nxdialog3-mask';
    document.body.appendChild(dialogmask);


    document.body.appendChild(dialog);
    dialog.appendChild(dialogheader);
    dialogheader.appendChild(dialogtitle);
    dialogheader.appendChild(dialogclose);
    dialog.appendChild(dialogcontent);;
    dialogclose.setAttribute('onclick','hideDialog3()');
    dialogclose.onclick = hideDialog3;
  } else {
    dialog = document.getElementById('nxdialog3');
    dialogheader = document.getElementById('nxdialog3-header');
    dialogtitle = document.getElementById('nxdialog3-title');
    dialogclose = document.getElementById('nxdialog3-close');
    dialogcontent = document.getElementById('nxdialog3-content');
    dialogmask = document.getElementById('nxdialog3-mask');
    dialogmask.style.visibility = "visible";
    dialog.style.visibility = "visible";
  }
  dialog.style.opacity = .00;
  dialog.style.filter = 'alpha(opacity=0)';
  dialog.alpha = 0;
  var width = pageWidth();
  var height = pageHeight();
  var left = leftPosition();
  var top = topPosition();
  var dialogwidth = dialog.offsetWidth;
  var dialogheight = dialog.offsetHeight;
  var topposition = top + (height / 3) - (dialogheight / 2);
  var leftposition = left + (width / 2) - (dialogwidth / 2);
  dialog.style.top = topposition + "px";
  if(toppos)
	  dialog.style.top = toppos;
  dialog.style.left = leftposition + "px";
  if(leftpos)
	  dialog.style.left = leftpos;
  dialogheader.className = type + "header";
  dialogtitle.innerHTML = title;
  dialogcontent.className = type;
  dialogcontent.innerHTML = message;

  dialogmask.style.height = pageHeight();
  
  dialog.timer = setInterval("fadeDialog3(1)", TIMER);
  if(autohide) {
    dialogclose.style.visibility = "hidden";
    window.setTimeout("hideDialog3()", (autohide * 1000));
  } else {
    dialogclose.style.visibility = "visible";
  }
}

// hide the second dialog box //
function hideDialog3(vAutoHideFirstDialog) 
{
  var dialog = document.getElementById('nxdialog3');
  if (dialog == null)
  	return;
  
  if (vAutoHideFirstDialog == null)
  	vAutoHideFirstDialog = 0;
  if (dialog == null && vAutoHideFirstDialog)
  {
  	hideDialog();
  	return;
  }
  if (dialog.timer != null)
  {
	  clearInterval(dialog.timer);
  }
  dialog.timer = setInterval("fadeDialog3(0," + vAutoHideFirstDialog + ")", TIMER);
}

// fade-in the second dialog box //
function fadeDialog3(flag,vAutoHideFirstDialog) {
  if(flag == null) {
    flag = 1;
  }
  if(vAutoHideFirstDialog == null) {
    vAutoHideFirstDialog = 0;
  }  
  var dialog = document.getElementById('nxdialog3');
  var value;
  if(flag == 1) {
    value = dialog.alpha + SPEED;
  } else {
    value = dialog.alpha - SPEED;
  }
  dialog.alpha = value;
  dialog.style.opacity = (value / 100);
  dialog.style.filter = 'alpha(opacity=' + value + ')';
  if(value >= 99) {
    clearInterval(dialog.timer);
    dialog.timer = null;
  } else if(value <= 1) {
    dialog.style.visibility = "hidden";
    document.getElementById('nxdialog3-mask').style.visibility = "hidden";
    clearInterval(dialog.timer);
    if (vAutoHideFirstDialog)
    	hideDialog();
  }
}

