

$(document).ready(function() {

	sinusHoverX.init('.sinus-hover');
	sinusMoveY.init('.coneman-body');
	conemanEye.init('.coneman-eye');
	
	testFrameLoop.init();

	frameLoop.init(25);
	
	$(document).mousemove(function(e){
		updateMousePosition(e);
	});
	
});

var mousePosition = {
	left: 0,
	top: 0
};

function updateMousePosition (e) {
	mousePosition.left = e.pageX;
	mousePosition.top = e.pageY;
}

var testFrameLoop = {
	init : function (elementSelector) {
		frameLoop.stepFrameFunctions.push(testFrameLoop.stepframe);	
	},
	stepframe : function () {

	}

}

function calculateRadiansBetween(PositionOne,PositionTwo){
	

	
	var distanceX = PositionTwo.left - PositionOne.left;
	var distanceY = PositionTwo.top - PositionOne.top;

	var radian = Math.atan2(distanceY, distanceX);
	
	return radian;
	
}

var conemanEye = {
	init : function (elementSelector) {
		
		conemanEye.randomizeNextBlink();
		
		var elementsAsArray = $(elementSelector);
		
		for(var i=0; i<elementsAsArray.length;i++){
			conemanEye.arrayOfIds.push(ReturnOrCreateId(elementsAsArray[i]));
			var elementPosition = $(elementsAsArray[i]).position();
			conemanEye.arrayOfOriginalPositions.push(elementPosition);
		}
		
		frameLoop.lateStepFrameFunctions.push(conemanEye.stepframe);	

	},
	arrayOfIds : [],
	arrayOfOriginalPositions : [],
	closeEyes : function (element) {
		$('#'+element).css({
			backgroundPosition : '0 -20px'
		});
	},
	openEyes : function (element) {
		$('#'+element).css({
			backgroundPosition : '0 0'
		});
	},
	blinkForFrames : 4,
	blickClock : 0,
	nextBlink : 0,
	nextBlinkMin : 40,
	nextBlinkMax : 100,
	randomizeNextBlink : function () {
		conemanEye.nextBlink = conemanEye.nextBlinkMin + Math.random() * conemanEye.nextBlinkMax;
	},
	stepframe : function () {

		
		
		for(var i = 0; i < conemanEye.arrayOfIds.length;i++){
			
			if(conemanEye.blickClock == 1) conemanEye.closeEyes(conemanEye.arrayOfIds[i]);
			if(conemanEye.blickClock == conemanEye.blinkForFrames) conemanEye.openEyes(conemanEye.arrayOfIds[i]);
			
			var Parentoffset = $('#'+conemanEye.arrayOfIds[i]).parent().offset();

			var centerOfEyePosition = {
				left: Parentoffset.left + conemanEye.arrayOfOriginalPositions[i].left,
				top: Parentoffset.top + conemanEye.arrayOfOriginalPositions[i].top
			} 
			
			var distanceBetweenMouseAndEyeCenter = {
				left: mousePosition.left - centerOfEyePosition.left,
				top: mousePosition.top - centerOfEyePosition.top
			}
			
			

			var irisPosition  = {
				left : distanceBetweenMouseAndEyeCenter.left  * 0.4,
				top : distanceBetweenMouseAndEyeCenter.top * 0.4
			}


			radiansBetween = calculateRadiansBetween(centerOfEyePosition, mousePosition);

			var eyeLimit = {
				left : Math.cos(radiansBetween)*5,
				top : Math.sin(radiansBetween)*8
			}
			
			if(Math.abs(irisPosition.left) > Math.abs(eyeLimit.left)){
				irisPosition.left = eyeLimit.left;
			}
			
			if(Math.abs(irisPosition.top) > Math.abs(eyeLimit.top)){
				irisPosition.top = eyeLimit.top;
			}

			var currentPosition = {
				left : conemanEye.arrayOfOriginalPositions[i].left + irisPosition.left,
				top : conemanEye.arrayOfOriginalPositions[i].top + irisPosition.top
			}

			$('#'+conemanEye.arrayOfIds[i]).css({
				left : currentPosition.left + 'px',
				top : currentPosition.top + 'px'
			});
			
		}
		
		conemanEye.blickClock++;
		if(conemanEye.blickClock > conemanEye.nextBlink){
			conemanEye.blickClock = 0;
			conemanEye.randomizeNextBlink();
		}
		
	}

}

var sinusMoveY = {
	init : function (elementSelector) {
		
		var elementsAsArray = $(elementSelector);
		
		for(var i=0; i<elementsAsArray.length;i++){
			sinusMoveY.arrayOfIds.push(ReturnOrCreateId(elementsAsArray[i]));
			var elementPosition = $(elementsAsArray[i]).position();
			sinusMoveY.arrayOfOriginalPositions.push(elementPosition);
		}
		
		frameLoop.stepFrameFunctions.push(sinusMoveY.stepframe);	

	},
	arrayOfIds : [],
	arrayOfOriginalPositions : [],
	
	stepframe : function () {
		for(var i = 0; i < sinusMoveY.arrayOfIds.length;i++){
			var currentPosition = {
				left : sinusMoveY.arrayOfOriginalPositions[i].left,
				top : sinusMoveY.arrayOfOriginalPositions[i].top + Math.sin(frameLoop.frame * 0.18) * 2
			}

			$('#'+sinusMoveY.arrayOfIds[i]).css({
				left : currentPosition.left + 'px',
				top : currentPosition.top + 'px'
			});
			
		}
	}

}


var sinusHoverX = {
	init : function (elementSelector) {
		
		var elementsAsArray = $(elementSelector);
		
		for(var i=0; i<elementsAsArray.length;i++){
			sinusHoverX.arrayOfIds.push(ReturnOrCreateId(elementsAsArray[i]));
			var elementPosition = $(elementsAsArray[i]).position();
			sinusHoverX.arrayOfOriginalPositions.push(elementPosition);
		}
		
		/*
		$(elementSelector).hover(
		  function () {
		    console.log('inside');
		  },
		  function () {
		    console.log('outside');
		  }
		);*/
		
		frameLoop.stepFrameFunctions.push(sinusHoverX.stepframe);	

	},
	arrayOfIds : [],
	arrayOfOriginalPositions : [],
	
	stepframe : function () {
		for(var i = 0; i < sinusHoverX.arrayOfIds.length;i++){
			var currentPosition = {
				left : sinusHoverX.arrayOfOriginalPositions[i].left + Math.sin(frameLoop.frame * 0.15) * 10,
				top : sinusHoverX.arrayOfOriginalPositions[i].top
			}
			
			
			
			$('#'+sinusHoverX.arrayOfIds[i]).css({
				left : currentPosition.left + 'px',
				top : currentPosition.top + 'px'
			});
			
		}
	}

}



var AssignedIdCount = 0;

function ReturnOrCreateId(Element){
	var TheId = $(Element).attr('id');
	if(TheId==null){
		var TheId = 'assigned-id-' + AssignedIdCount;
		$(Element).attr({
		  id: TheId
		});
		AssignedIdCount++;
	}
	return TheId;
}



var frameLoop = {
	init : function (intervalSpeed) {
		frameLoop.frame = 0;
		frameLoop.intervalSpeed = intervalSpeed==null ? 20 : intervalSpeed;

		if (frameLoop.loop!=null){
			window.clearInterval(frameLoop.loop);
		} 

		frameLoop.loop = window.setInterval(
			function(){
				frameLoop.stepFrame();
			}
		,frameLoop.intervalSpeed);
	},
	stepFrameFunctions : [],
	lateStepFrameFunctions : [],
	intervalSpeed : null,
	loop : null,
	frame : 0,
	stepFrame : function () {
		
		

		for(var i=0; i < frameLoop.stepFrameFunctions.length; i++){
			frameLoop.stepFrameFunctions[i]();
		}

		for(var i=0; i < frameLoop.lateStepFrameFunctions.length; i++){
			frameLoop.lateStepFrameFunctions[i]();
		}


		frameLoop.frame ++;
	}
}


