function iOScroll(target) {
	
	this.eventTarget = null;
	this.scrollTarget = null;
	
	this.lockX=false;
	this.lockY=true;
	
	// speed
	this.deltaT1=0;
	this.deltaT2=0;
	this.deltaX1=0;
	this.deltaX2=0;
	this.deltaY1=0
	this.deltaY2=0;
	
	// SETTER
	this.setEventTarget = function(target) {
		if(target) {
			this.eventTarget = target;
			return true;
		}
		return false;
	}
	
	this.setScrollTarget = function(target) {
		if(target) {
			this.scrollTarget = target;
			return true;
		}
		return false;
	}
	
	// --------- the evil starts here ------------------------------------------
	this.whileScrolling = function() { 
	/*
		minPixels = 350; // after that start preloading next
		if(this.getScrollState()<minPixels) {
			alert(this.getScrollState());
			window.kcaload.loadNextImage();
		}
	*/
	}
	
	this.getScrollState = function(direction) {
		
		/*
		 *	Returns position of scrollTarget relative to eventTarget
		 */
		
		if(!this.scrollTarget || !this.eventTarget)
			return false;
					
		e = this.scrollTarget;
		p = this.scrollTarget.parentNode;

		if( (l=this.scrollTarget.style.webkitTransform) && (l!='') ) { // iOS device
			
			wt = new webkitTransform(e);
			
			if(direction=='Y') {
				return (parseFloat(e.offsetHeight) + parseFloat(wt.getY()) - parseFloat(p.offsetHeight));
			} else {
				return (parseFloat(e.offsetWidth) + parseFloat(wt.getX()) - parseFloat(p.offsetWidth));
			}
			
			
		} else {

			if(direction=='Y') {
				return (parseFloat(e.offsetHeight) - parseFloat(p.scrollTop) - parseFloat(p.offsetHeight));
			} else {

				return (parseFloat(e.offsetWidth) - parseFloat(p.scrollLeft) - parseFloat(p.offsetWidth));
			}
		
		}
		
		wt = new webkitTransform();
					
	}

	this.getScrollPos = function(direction) {
		if(!this.scrollTarget || !this.eventTarget)
			return false;
					
		e = this.scrollTarget;
		p = this.scrollTarget.parentNode;

		if( (l=this.scrollTarget.style.webkitTransform) && (l!='') ) { // iOS device
			
			wt = new webkitTransform(e);
			
			if(direction=='Y') {
				return -1 * parseFloat(wt.getY());
			} else {
				return -1 * parseFloat(wt.getX());
			}
			
			
		} else {

			if(direction=='Y') {
				return parseFloat(p.scrollTop);
			} else {

				return parseFloat(p.scrollLeft);
			}
		
		}
		
		wt = new webkitTransform();
	}
	// --------- the evil ends here ------------------------------------------

	this.initEvents = function() {
				
		if(!target)
			return false;
		
		target.iOScroll=this;
		addEvent(target, 'touchstart', function(e) {
			
			this.iOScroll.deltaX1 = e.touches[0].pageX;
			this.iOScroll.deltaY1 = e.touches[0].pageY;
			this.iOScroll.deltaT1 = new Date().getTime();
			
			target = this.iOScroll.scrollTarget;
			target.style.webkitTransition='none';
		
			target.touchStartX = e.touches[0].pageX;
			target.touchStartY = e.touches[0].pageY;
			
			wt = new webkitTransform(target);

			this.iOScroll.scrollTarget.StartX = wt.getX();
			this.iOScroll.scrollTarget.StartY = wt.getY();

			window.blockLoading=true;
		
		});
		
		addEvent(target, 'touchmove', function(e) {

			target = this.iOScroll.scrollTarget;
		
			var newX = target.StartX - (target.touchStartX - e.changedTouches[0].clientX);
			var newY = target.StartY - (target.touchStartY - e.changedTouches[0].clientY);
			
			wt = new webkitTransform(target);
			if(!this.iOScroll.lockX) {
				wt.setX(newX);
			}
			
			if(!this.iOScroll.lockY) {
				wt.setY(newY);
			}
			
			this.iOScroll.whileScrolling();
		
		});
		
		addEvent(target, 'touchend', function(e) {
		
			target = this.iOScroll.scrollTarget;
			wt = new webkitTransform(target);
			
			this.iOScroll.deltaX2 = e.changedTouches[0].clientX;
			this.iOScroll.deltaY2 = e.changedTouches[0].clientY;
			this.iOScroll.deltaT2 = new Date().getTime();
			
			var speedX=0, speedY=0;
			
			if(!this.iOScroll.lockX)
				speedX = (this.iOScroll.deltaX1 - this.iOScroll.deltaX2) / (this.iOScroll.deltaT1 - this.iOScroll.deltaT2);
			
			
			if(!this.iOScroll.lockY)
				speedY = (this.iOScroll.deltaY1 - this.iOScroll.deltaY2) / (this.iOScroll.deltaT1 - this.iOScroll.deltaT2);
		
			//this.iOScroll.getScrollState('X');
			target.flowOut(speedX, speedY);
			this.iOScroll.whileScrolling();
			
			// snapback left
			if(wt.getX()>0) {
				target.snapBack(0,null);
			}	
			
			// snapback right
			if(wt.getY() < (window.innerWidth-target.clientWidth)) {
				alert('snapbackRight');
				target.snapBack(window.innerWidth-target.clientWidth);
			}

			setTimeout('window.blockLoading=false;',500);
			
		});
		
		if(!this.scrollTarget) {
			return false;
		}
		
		// scrollTarget		
		this.scrollTarget.snapBack = function(posX, posY) {
			
			target = this;
			wt = new webkitTransform(target);
			
			// start snapback
			target.style.webkitTransition = '-webkit-transform 0.5s ease-out';
			
			if(posX!=null) {
				wt.setX(posX);
			}
				
			if(posY!=null) {
				wt.setY(posX);
			}
			
			// stop snapback (end)
			if(target.timeout)
				clearTimeout(target.timeout);
				
			target.timeout = setTimeout('$(\''+target.id+'\').reset();',500); // generate new id if not exists !?
			
			// while snapback
			addEvent(this, 'touchstart', function() {
			 	if(this.timeout)
					clearTimeout(this.timeout);
			});
					
		}
		
		this.scrollTarget.flowOut = function( speedX, speedY ) {
		
			target = this;
			wt = new webkitTransform(target);
			
			// start flowOut
			target.style.webkitTransition = '-webkit-transform 0.5s ease-out 0.0s';
			
			var multiplicator = 240;
						
			if(speedX!=0) {
				pos = wt.getX() + (speedX*multiplicator);
				wt.setX(pos);
			}
			
			if(speedY!=0) {
				pos = wt.getY() + (speedY*multiplicator);
				wt.setY(pos);
			}
			
			// stop flowOut (end)
			if(target.timeout)
				clearTimeout(target.timeout);
				
			target.timeout = setTimeout('$(\''+target.id+'\').reset();',500); // generate new id if not exists !?
					
		}
		
		this.scrollTarget.reset = function() {
			/*
			 *	Resets webkitTransition
			 */
			 
			target = this;
			target.style.webkitTransition = 'none';
		}
	
	}
	
	// INIT iOScroll
	this.setEventTarget(target);
	//this.setScrollTarget(target);
	

}

