/*
	DynAPI Distribution
	Swiper Animation Extension - originally designed by Erik Arvidsson (http://web.eae.net)
	IncDec addon - Created by Daniel Tiru (http://www.tiru.se)

	The DynAPI Distribution is distributed under the terms of the GNU LGPL license.
	
	requires: DynLayer
	
*/

Swiper = {}; // used by dynapi.library

DynLayer.prototype.swipeTo = function(dir, steps, ms, min) {

	this._swipeSteps = (steps!=null)? steps: 4;
	this._swipeMS = (ms!=null)? ms:25;
	this._swipeDir=dir;
	this._swiperMin=min;
	if (this._swiperMinimized==null) { 
		this._swiperMinimized = 0
	}

	if (this.swipeTimer != null) window.clearTimeout(this.swipeTimer);
		
	if (!this._swipeCnt) {		// No animation yet!
		this._swipeOrgX  = this.getX();
		this._swipeOrgY  = this.getY();
		this._swipeOrgWidth = this.getWidth();
		this._swipeOrgHeight  = this.getHeight();
	}
	
	this._swipeCnt = this._swipeSteps;
	if (dir.substr(0,3)!='dec' && dir.substr(0,3)!='inc') {
		this.setClip([0,0,0,0]);
	}
	window.setTimeout(this+"._swipe()", this._swipeMS);
};
DynLayer.prototype._swipe = function() {
	var steps	= this._swipeSteps;
	var x = this._swipeOrgX;
	var y = this._swipeOrgY;
	var w = this._swipeOrgWidth;
	var h = this._swipeOrgHeight;
	var min = this._swiperMin;
	
	if (this._swipeCnt == 0) {
		if (this._swipeDir.substr(0,3)!='dec' && this._swipeDir.substr(0,3)!='inc') {
			this.setClip([0, w, h,0]);
		}
		else if(this._swipeDir.substr(0,3)=='dec') {
			this._swiperMinimized=1;
		}
		else if(this._swipeDir.substr(0,3)=='inc') {
			this._swiperMinimized=0;
		}
		this.invokeEvent('swipefinish');
		return;
	}
	else {
		this._swipeCnt--;
		this.setVisible(true);
		switch (this._swipeDir) {
			case "bottom":		//down (see the numpad)
				this.setClip([h * this._swipeCnt / steps, w, h, 0]);
				this.setY(y - h * this._swipeCnt / steps);
				break;
			case "top":
				this.setClip([0, w, h * (steps - this._swipeCnt) / steps, 0]);
				this.setY(y + h * this._swipeCnt / steps);
				break;
			case "right":
				this.setClip([0, w, h,w * this._swipeCnt / steps]);
				this.setX(x - w * this._swipeCnt / steps);
				break;
			case "left":
				this.setClip([0, w * (steps - this._swipeCnt) / steps, h, 0]);
				this.setX(x + w * this._swipeCnt / steps);
				break;
			case "bottom-right":
				this.setClip([h * this._swipeCnt / steps, w, h, w * this._swipeCnt / steps]);
				this.setX(x - w * this._swipeCnt / steps);
				this.setY(y - h * this._swipeCnt / steps);
				break;
			case "bottom-left":
				this.setClip([h * this._swipeCnt / steps, w * (steps - this._swipeCnt) / steps, h, 0]);
				this.setX(x + w * this._swipeCnt / steps);
				this.setY(y - h * this._swipeCnt / steps);
				break;
			case "top-left":
				this.setClip([0, w * (steps - this._swipeCnt) / steps, h * (steps - this._swipeCnt) / steps, 0]);
				this.setX(x + w * this._swipeCnt / steps);
				this.setY(y + h * this._swipeCnt / steps);
				break;
			case "top-right":
				this.setClip([0, w, h * (steps - this._swipeCnt) / steps, w * this._swipeCnt / steps]);
				this.setX(x - w * this._swipeCnt / steps);
				this.setY(y + h * this._swipeCnt / steps);
				break;
			// inc-dec
			case "dec-right":
				if (this._swiperMinimized==0) {
					if ((w/steps*this._swipeCnt) > min) {
						this.setClip([0, (w/steps*this._swipeCnt), h, 0]);
					}
					else this.setClip([0, min, h, 0]);
				}
				break;
			case "inc-right":
				//var clippos = this.getClip().toString().split(',');
				if (this.getClip()[1] < w-(w/steps*this._swipeCnt)) {
					if (this._swiperMinimized==1) {
						this.setClip([0, w-(w/steps*this._swipeCnt), h, 0]);
					}
				}
				break;
			case "dec-left":
				if (this._swiperMinimized==0) {
					if ((w/steps*this._swipeCnt) > min) {
						this.setClip([0, Math.round(w/steps*this._swipeCnt), h, 0]);
						this.setX(w+(x-(Math.round(w/steps*this._swipeCnt))));
					}
					else{
						this.setClip([0, min, h, 0]);
						this.setX(w+x-min);
					}
				}
				break;
			case "inc-left":
				if (this._swiperMinimized==1) {
					if (this.getClip()[1] < w-Math.round(w/steps*this._swipeCnt)) {
						this.setClip([0, w-Math.round(w/steps*this._swipeCnt), h, 0]);
						if (w-(w/steps*this._swipeCnt) < x) {
							this.setX(x-(w-Math.round(w/steps*(this._swipeCnt)+min)));
						}
						else this.setX((steps*w/steps)-(x));
					}
				}
				break;
			case "dec-down":
				if (this._swiperMinimized==0) {
					if ((h/steps*this._swipeCnt) > min) {
						this.setClip([0, w, (h/steps*this._swipeCnt), 0]);
					}
					else this.setClip([0, w, min, 0]);
				}
				break;
			case "inc-down":
				if (this._swiperMinimized==1) {
					if (this.getClip()[2] < h-(h/steps*this._swipeCnt)) {
						this.setClip([0,w, h-(h/steps*this._swipeCnt), 0]);
					}
				}
				break;
			case "dec-up":
				if (this._swiperMinimized==0) {
					if ((h/steps*this._swipeCnt) > min) {
						this.setClip([0, w, Math.round(h/steps*this._swipeCnt), 0]);
						this.setY((h+y-(Math.round(h/steps*this._swipeCnt))));
					}
					else{
						this.setClip([0, w, min, 0]);
						this.setY(h+y-min);
					}
				}
				break;
			case "inc-up":
				if (this._swiperMinimized==1) {
					if (this.getClip()[2] < h-Math.round(h/steps*this._swipeCnt)) {
						this.setClip([0, w, h-Math.round(h/steps*this._swipeCnt), 0]);
						if (h-(h/steps*this._swipeCnt) < y) {
							this.setY(y-(h-Math.round(h/steps*(this._swipeCnt)+min)));
						}
						else this.setY((steps*h/steps)-(y-min));
					}
				}
				break;
		}		
		this.swipeTimer = window.setTimeout(this+"._swipe()", this._swipeMS);
	}
};