var viewer = {
	aPos: []
,	nCurIndex: 0	// current 'unit'
,	timer: null		// 
,	nCurInterval: 0 // Interval counter
,	interval: 40	// ms
,	nDistance: 0	// ... between 'units' 
,	nDir: 0			// +1 - next, -1 - back
,	dEaseFactor: 1.5	// used by  curDistance()

,	reset: function(aPos, interval, dEaseFactor){
		viewer.aPos = aPos;
		viewer.nCurIndex = 0;
		viewer.timer = null;
		viewer.nCurInterval = 0;
		viewer.interval = interval;
		viewer.nDistance = 0;
		viewer.nDir = 0;
		viewer.dEaseFactor = dEaseFactor;
	}
,	nextStart: function(){
		if(viewer.timer || viewer.nCurIndex == viewer.aPos.length - 1) return;
		viewer.nDistance = viewer.aPos[viewer.nCurIndex + 1] - viewer.aPos[viewer.nCurIndex];
		viewer.nCurInterval = 0;
		viewer.timer = setInterval(viewer.nextMove, viewer.interval);
	}
,	nextMove: function(){
		var nCurDistance = viewer.curDistance()
		if(Math.abs(nCurDistance - viewer.nDistance) <= 1){
			clearInterval(viewer.timer);
			viewer.timer = null;
			viewer.nCurIndex++;
			viewer.setLeft(viewer.aPos[viewer.nCurIndex]);
			return;
		}
		viewer.setLeft(viewer.aPos[viewer.nCurIndex] + nCurDistance);
		viewer.nCurInterval++;
	}
,	backStart: function(){
		if(viewer.timer || viewer.nCurIndex == 0) return;
		viewer.nDistance = viewer.aPos[viewer.nCurIndex] - viewer.aPos[viewer.nCurIndex - 1];
		viewer.nCurInterval = 0;
		viewer.timer = setInterval(viewer.backMove, viewer.interval);
	}
,	backMove: function(){
		var nCurDistance = viewer.curDistance()
		if(Math.abs(nCurDistance - viewer.nDistance) <= 1){
			clearInterval(viewer.timer);
			viewer.timer = null;
			viewer.nCurIndex--;
			viewer.setLeft(viewer.aPos[viewer.nCurIndex]);
			return;
		}
		viewer.setLeft(viewer.aPos[viewer.nCurIndex] - nCurDistance);
		viewer.nCurInterval++;
	}
,	setLeft: function(n){
		var o = document.getElementById("viewdisplacement");
		o.style.left = (-n) + 'px';
	}
,	curDistance: function(){ 
		return Math.floor(viewer.nDistance*(1 - Math.pow(viewer.dEaseFactor, -1-viewer.nCurInterval)));
	}
};
