JKow.namespace(["Anim"]);

JKow.Anim.Bounce = JKow.extend(
	JKow.Anim.Transform, 
	{
		accel : -0.007,
		velocity : null, 
		start_velocity : null,
		anim_state : 'rest',
		old_state : null,
		next_state : null,
		timer : null,
		view : null,
		coords : null, 
		stepAnim : function(sender){
			if (sender.element == null || typeof sender.element == "undefined") return false;

			switch (sender.anim_state){
				case 'idle' :
					return;
				break;
				case 'rest' :

					if (Math.round(sender.coords.y) <= 0.0){
						sender.velocity = -(sender.velocity);
						sender.coords.y = 0.0;
						if ((Math.abs(sender.velocity)) < 1.0) {
							sender.anim_state = 'idle';
							sender.velocity = sender.start_velocity;
						}
					}
					sender.element.style.top = parseInt(sender.view.scr_offset_y - sender.view.viewYToScrY(sender.coords.y)).toString() + 'px';
					sender.velocity = sender.velocity + sender.accel;
					sender.coords.y = sender.coords.y + sender.velocity;	
				break;
				case 'rise' :
					/*if ((Math.round(sender.coords.y) >= 32.0)  || ((Math.abs(sender.velocity) < 0.5) && (Math.round(sender.coords.y) > 0.0))){*/ 
					sender.velocity = sender.velocity + sender.accel;
					sender.coords.y = sender.coords.y + sender.velocity;	
					if (Math.abs(sender.coords.y) > 4.0){
						sender.coords.y = 4.0;
						sender.element.style['top'] = '0px';
						if (sender.next_state == 'rest'){
							sender.next_state = null;
							sender.anim_state = 'rest';
						} else {
							sender.anim_state = 'idle';
						}
						sender.velocity = -(sender.start_velocity);
						return;
					}
					sender.element.style.top = parseInt(sender.view.scr_offset_y - sender.view.viewYToScrY(sender.coords.y)).toString() + 'px';
				break;
			}	
		},
		changeState : function (s) {
			var sender = this;
			sender.old_state = sender.anim_state;
			switch (s){
				case 'rest':
					if (sender.old_state != 'rise'){
						sender.velocity = sender.start_velocity;
						sender.anim_state = s;
					}
					sender.next_state = 'rest';
				break;

				case 'rise':
					if (sender.old_state != 'rise'){
						sender.velocity = 0.35;
						/*sender.velocity = -(sender.start_velocity);*/
					}
					sender.next_state = null;
					sender.anim_state = s;
				break;
			}
	      	},
		start : function() {
			var sender = this;
			sender.view = new JKow.View();
			sender.timer = new JKow.Util.Timer();

			/* note : these should be initialized here, or they will be static */
			sender.coords = { x : 0.0, y : 0.0 };
			sender.velocity = 0.05;
			sender.timer.interval = 25;
			sender.start_velocity = 0.05;

			sender.element.style['top'] = '100px';
			sender.element.style['left'] = '0px';
			sender.timer.ontimer = function(){ sender.stepAnim(sender); }
			sender.timer.start();
		}
	}
);
