/**
 * ...
 * @author Glidias
 */

function ScrollParallaxUtil() {
	
	var that = this;
	this.arrTargets = [];
	this.arrTargets2 = [];
	this.currentScroll = 0;
	this.screenY  = 0;
	this.windowHeight = 0;
	this.window = $(window);

	
	this.scrollUpdateHandler = function() {
		
		that.currentScroll = that.window.scrollTop();
		var len = that.arrTargets.length;
		var i;
		var params;
		for (i=0; i< len; i++) {
			params = that.arrTargets[i];
			if ( that.currentScroll >= params.from) 
				params.method( params, that );
			
		}
		
		len = that.arrTargets2.length;
		for (i=0; i< len; i++) {
			params = that.arrTargets2[i];
				
			if ( that.currentScroll >= params.from && that.currentScroll < params.to ) {
				params.method( params, that );	
			}
		}
		//console.log(that.currentScroll);
	}
	
	this.onWindowResize = function()  {
		var windowHeight = $(window).height();
		that.windowHeight  = windowHeight;
		that.screenY = .5 * windowHeight;
		that.scrollUpdateHandler();
		
	}
	
}

ScrollParallaxUtil.prototype.activate = function() {
	var wind = $(window);
	wind.bind('scroll', this.scrollUpdateHandler );
	wind.resize( this.onWindowResize );
	
	this.onWindowResize();
}

ScrollParallaxUtil.prototype.deactivate = function() {
	$(window).unbind('scroll', this.scrollUpdateHandler);
}

ScrollParallaxUtil.prototype.tweenProp = function(params, that) {
	var ratio =  params.ratio; //GaiaTween.Cubic.easeOut( (that.currentScroll-params.from)*params.ratio / (params.to- params.from) );
	params.target.css( params.prop, ( params.fromResult - (that.currentScroll-params.from) * ratio) +"px"); //+ that.screenY
}

ScrollParallaxUtil.prototype.tweenSpriteSheet = function(params, that) {
	var tarFrame = Math.floor(  (that.currentScroll - params.from ) / params.intervalPx );
	tarFrame = params.loop && tarFrame >= params.totalFrames ?  tarFrame % params.totalFrames : tarFrame;
	tarFrame = -(params.frameWidth * tarFrame);
	params.target.css( "background-position", tarFrame+"px"+" 0px");
	params.bgx = tarFrame;
}



ScrollParallaxUtil.prototype.tweenPropBGy = function(params, that) {
	var p = params.bgy-( (that.currentScroll-params.from) * params.ratio); // + that.screenY
	//var p = -(  that.currentScroll - params.from * params.ratio); 
	//params.bgy = p;
	params.target.css( "background-position", params.bgx + "px " + p +"px");
}
ScrollParallaxUtil.prototype.tweenPropBGx = function(params, that) {
	var p =  params.bgx-(params.from + (that.currentScroll * params.ratio) + that.screenY);
	//params.bgx = p;
	params.target.css( "background-position", p +"px "+params.bgy + "px");
}

ScrollParallaxUtil.prototype.addPropTween = function(target, prop, ratio, fromVal, fromResult) {
	this.arrTargets.push({
		method: this.tweenProp,
		target: target,
		prop: prop,
		ratio: ratio,
		from: fromVal,
		fromResult:fromResult
	});	
}

ScrollParallaxUtil.prototype.addPropTween2 = function(target, prop, values) {
	
	var len = values.length / 3;
	var i;
	var ratio;
	var toResult;
	var fromResult;
	var to = 0;
	var from = 0;
	var toResult;
	var fromResult;
	var lastTarget;
	for (i=0; i< len; i++) {
		to = values[i*3];
		fromResult = values[i*3+1];
		toResult = values[i*3+2];
		ratio = (toResult - fromResult) / (to-from);
		this.arrTargets2.push( lastTarget = {
			method: this.tweenProp,
			target: target,
			ratio: ratio,
			prop:prop,
			from: from,
			to: to,
			fromResult: fromResult,
			toResult: toResult
		});
		
		from = to;
	}
	if (lastTarget) lastTarget.to = 9999999999999;
	
}


ScrollParallaxUtil.prototype.addBGPropTween = function(target, tweenY, ratio, fromVal, startX, startY) {
	startX = startX || 0;
	startY = startY || 0;
	this.arrTargets.push({
		method: tweenY ? this.tweenPropBGy : this.tweenPropBGx,
		target: target,
		ratio: ratio,
		from: fromVal,
		bgx: startX,
		bgy: startY
	});
}

ScrollParallaxUtil.prototype.addSpriteSheet2 =  function(target, frameWidth, totalFrames, loop,values) {
	var len = values.length / 3;
	var i;
	var ratio;
	var toResult;
	var to = 0;
	var from = 0;
	var toResult;
	var fromResult;
	var lastTarget;
	var totalFrames;
	var intervalPx;
	for (i=0; i< len; i++) {
		to = values[i*3];
		fromResult = values[i*3+1];
		toResult = values[i*3+2];
		intervalPx = (toResult - fromResult) / (to-from);
		this.arrTargets2.push({
			method: this.tweenSpriteSheet,
			target: target,
			frameWidth: frameWidth,
			totalFrames: totalFrames,
			intervalPx: intervalPx,
			loop: loop,
			from: from,
			to: to,
			fromResult: fromResult,
			toResult: toResult
		});
		from = to;
		
	}
	
	if (lastTarget) {
		lastTarget.to = 9999999999999;
	}
	
}

ScrollParallaxUtil.prototype.addSpriteSheet =  function(target, frameWidth, totalFrames, intervalPx, loop, from, fromResult) {
	fromResult = fromResult || 0;
	this.arrTargets.push({
		method: this.tweenSpriteSheet,
		target: target,
		frameWidth: frameWidth,
		totalFrames: totalFrames,
		intervalPx: intervalPx,
		loop: loop,
		from: from,
		fromResult: fromResult
	});
}

ScrollParallaxUtil.prototype.addSpriteSheetAdv = function(target, frameData, fromVal) {
	/*
	this.arrTargets.push({
		method: this.tweenSpriteSheet,
		target: target,
		frameWidth: frameWidth,
		totalFrames:,
		ratio: ratio,
		from: fromVal
	});
	*/
}
	

