/*************************************** ANIMATOR *************************************************************************************/
/**
 * Třída pro animace elementů s využitím interpolatoru.
 * Bude umet pohyb elementu po obrazovce, pocet poskoku po dojeti k urcitemu kraji a fade elementu
 * @namespace
**/
SZN.Animator = SZN.ClassMaker.makeClass({
    NAME: "Animator",
    VERSION: "1.0",
    CLASS: "class"
});
/**
 * @constructor
 * @param {object} options - nosi nasledujici argumenty
 * elm {string} - animovany element
 * up {int} - false - nic jinak posouva element plynule na urcenou top pozici
 * down {int} - false - nic jinak posouva element plynule na urcenou bottom pozici
 * jumps {object} - jumpNum {int} - pocet poskoku, jumpPx {int} - o kolik poskoci, jumpFrq {int} - frequence rychlosti poskoku
 * fade {boolean} - false/true - fadne element opacity
 * unfade {boolean} - false/true - odfadne element opacity
 * frequency {int} - obecna frequence pro animaci elementu pri posunu a fadovani
 **/
SZN.Animator.prototype.$constructor = function(options){
	this.options = {
	    elm:  	'',
	    up:     false,
	    down:   false,
	    jumps:  {
	        jumpNum: 	0,
	        jumpPx:     0,
	        jumpFrq:    0
		},
		fade:   false,
		unfade: false,
		frequency:  0
	}
    for(p in options){
    	this.options[p] = options[p];
	}
	this.i = 0;
	this.elm = SZN.gEl(this.options.elm);
	this.jumps = this.options.jumps;
	this.jumpPx = this.jumps.jumpPx;
	/* provadeni fnce podle zadanych parametru */
	if( typeof(this.options.up) == 'number' ){
	    this._animeUp();
	} else if ( typeof(this.options.down) == 'number' ){
	    this._animeDown();
	} else if ( this.options.fade ){
	    this._fade();
	} else if ( this.options.unfade ){
	    this._unfade();
	}
}
/**
 * @method
 * vraci status dokonceni animace
 **/
SZN.Animator.prototype._status = function(){
	return true;
}
/**
 * @method
 * kontroluje animaci poskopu pri posunu elementu
 **/
SZN.Animator.prototype._animeJumps = function(){
    if(this.i<this.jumps.jumpNum){
		this._animeJumpDown();
	} else {
	    this.i = 0;
	    this._status();
	}
}
/**
 * @method
 * animuje poskok dolu o navolene pixely pri navolene frequenci
 **/
SZN.Animator.prototype._animeJumpDown = function(){
	var top = this.elm.offsetTop;
	var topJump = parseInt((top+this.jumpPx),10);
    var frq = this.jumps.jumpFrq/2;
	var intr = new SZN.CSSInterpolator(this.elm,frq,{ endCallback: SZN.bind(this,this._animeJumpUp) });
	intr.addProperty('top',top,topJump,'px');
	intr.start();
}
/**
 * @method
 * animuje poskok nahoru o navolene pixely pri navolene frequenci a pote puli pixely na polovic pro dalsi poskok dolu
 **/
SZN.Animator.prototype._animeJumpUp = function(){
	var top = this.elm.offsetTop;
	var topJump = parseInt((top-this.jumpPx),10);
    var intr = new SZN.CSSInterpolator(this.elm,this.jumps.jumpFrq,{ endCallback: SZN.bind(this,this._animeJumps) });
	intr.addProperty('top',top,topJump,'px');
	intr.start();
	this.i++;
    var px = this.jumpPx;
	this.jumpPx = px/2;
}
/**
 * @method
 * animuje posun elementu od spoda nahoru
 * Element musi mit nastylovanou pozici bottom
 **/
SZN.Animator.prototype._animeUp = function(){
	var top = parseInt(SZN.Dom.getStyle(this.elm,'top'),10);
    var elm = this.elm;
	var frqUp = this.options.frequency;
	if(this.jumps.jumpNum > 0){
	    var intr = new SZN.CSSInterpolator(elm,frqUp,{ endCallback: SZN.bind(this,this._animeJumps) });
	} else {
        var intr = new SZN.CSSInterpolator(elm,frqUp,{ endCallback: SZN.bind(this,this._status) });
	}
	intr.addProperty('top',top,this.options.up,'px');
	intr.start();
}
/**
 * @method
 * animuje posun elementu od shora dolu.
 * Element musi mit nastylovanou pozici top
 **/
SZN.Animator.prototype._animeDown = function(){
	var firefox2 = SZN.Browser.agent.indexOf('Firefox');
	if(firefox2 != -1 && SZN.Browser.version == 2){
	    var b = parseInt(SZN.Dom.getStyle(this.elm,'top'),10);
	    var bottom = b > 0 ? b*-1 : b*-1;
	} else {
		var bottom = parseInt(SZN.Dom.getStyle(this.elm,'bottom'),10);
	}
    var elm = this.elm;
	var frqUp = this.options.frequency;
	if(this.jumps.jumpNum > 0){
		var intr = new SZN.CSSInterpolator(elm,frqUp,{ endCallback: SZN.bind(this,this._animeJumps) });
	} else {
	    var intr = new SZN.CSSInterpolator(elm,frqUp,{ endCallback: SZN.bind(this,this._status) });
	}
	intr.addProperty('bottom',bottom,this.options.down,'px');
	intr.start();
}
/**
 * animuje fade elementu podle navolene frequence
 * pro jadro gecko se frequence nasobi o stonasobek
 **/
SZN.Animator.prototype._fade = function(){
    var opacity = SZN.Browser.client == 'ie' ? 100 : 1;
    var frq = this.options.frequency;
	var intr = new SZN.CSSInterpolator(this.elm,frq,{});
	intr.addProperty('opacity',0,opacity);
	intr.start();
}
/**
 * animuje unfade elementu podle navolene frequence
 * pro jadro gecko se frequence nasobi o stonasobek
 **/
SZN.Animator.prototype._unfade = function(){
    var opacity = SZN.Browser.client == 'ie' ? 100 : 1;
    var frq = this.options.frequency;
	var intr = new SZN.CSSInterpolator(this.elm,frq,{});
	intr.addProperty('opacity',opacity,0);
	intr.start();
}

