function getElementCenterCoords(elementObj) {
	var centerCoords=new Array();
	centerCoords['x']=0;
	centerCoords['y']=0;
	tempObj=elementObj;
	while (tempObj.offsetParent) {
		centerCoords['x'] += tempObj.offsetLeft;
		centerCoords['y'] += tempObj.offsetTop;
		tempObj = tempObj.offsetParent;
	}
	centerCoords['x'] += elementObj.offsetWidth/2;
	centerCoords['y'] += elementObj.offsetHeight/2;
	return centerCoords;
}

function getMouseXY (e) {
	var mouseCoords=new Array();
	mouseCoords['x']=0;
	mouseCoords['y']=0;
	if (!e) var e = window.event;
	if (e.pageX || e.pageY)
	{
		mouseCoords['x'] = e.pageX;
		mouseCoords['y'] = e.pageY;
	}
	else if (e.clientX || e.clientY)
	{
		mouseCoords['x'] = e.clientX + document.documentElement.scrollLeft;
		mouseCoords['y'] = e.clientY + document.documentElement.scrollTop;
	}
	return mouseCoords;
}

function getAngle(xDiff,yDiff) {
	if (yDiff==0) {
		if (xDiff>0) return 0;
		if (xDiff<0) return 180;
		if (xDiff==0) return 0;
	}
	if (xDiff==0) {
		if (yDiff>0) return 90;
		if (yDiff<0) return 270;
		if (yDiff==0) return 0;
	}
	var angle=Math.atan(yDiff/xDiff)*180/Math.PI;
	if (xDiff<0) angle+=180;
	if (angle<0) angle+=360;
	return angle;
}

function MagnetUnit(initAngle) {
	this.currentAngle=initAngle;
	this.targetAngle=initAngle;
	this.direction=1;
}


function calculateAnimationParam(targetAngle) {
	var d1,d2,b1,b2;
	this.targetAngle=Math.round(targetAngle/15)*15;
	d1=this.subtractCircleAngles(this.targetAngle,this.currentAngle);
	d2=this.subtractCircleAngles(this.targetAngle,this.addCircleAngles(this.currentAngle,180));
	if (Math.abs(d1)>Math.abs(d2)) {
		this.currentAngle=this.addCircleAngles(this.currentAngle,180);		
	}
	diff=this.targetAngle-this.currentAngle;
	if(0<= diff && diff<=90) {
		this.direction=1;		
	} else {
		this.direction=-1;	
	}
}

function getNextStep() {
	if (this.currentAngle==this.targetAngle) return false;
	this.currentAngle=this.addCircleAngles(this.currentAngle,this.direction*15);
	return this.currentAngle;
}

function addCircleAngles(angleA,angleB) {
	var angle=angleA+angleB;
	if (angle>360) angle-=360;
	if (angle<0) angle+=360;
	return angle;
}

function subtractCircleAngles(angleA,angleB) {
	var angle=angleA-angleB;
	if (Math.abs(angle)>180) angle=360-angle;
	return angle;
}

MagnetUnit.prototype.calculateAnimationParam=calculateAnimationParam;
MagnetUnit.prototype.getNextStep=getNextStep;
MagnetUnit.prototype.subtractCircleAngles=subtractCircleAngles;
MagnetUnit.prototype.addCircleAngles=addCircleAngles;

function animateMagnet(e) {
	var angle;
	angle=getMouseAngle(e,this);
	setMagnetAnimation(angle,this);
}

function getMouseAngle(e,magnetImgObject) {
	var mouseCoords,centerCoords,angle;
	centerCoords=getElementCenterCoords(magnetImgObject);
	mouseCoords=getMouseXY (e);
	return getAngle(mouseCoords['x']-centerCoords['x'],centerCoords['y']-mouseCoords['y']);
}

function setMagnetAnimation(mousePosAngle,magnetImgObject) {
	magnetImgObject.ma.calculateAnimationParam(mousePosAngle);
	window.clearInterval(magnetImgObject.interval);
	nextAnimationStep();
	magnetImgObject.interval=window.setInterval(nextAnimationStep, 100);
	function nextAnimationStep() {
		var step;
		step=magnetImgObject.ma.getNextStep();
		if (step==false) {
			window.clearInterval(magnetImgObject.interval);
		} else {
		magnetImgObject.src=magnetImagesArray[step].src;
		}
	}
}


function returnToInitPos() {
	var obj;
	this.ma.calculateAnimationParam(135);
	window.clearInterval(this.interval);
	obj=this;
	this.interval=window.setInterval(nextAnimationStep, 100);
	function nextAnimationStep() {
		var step;
		step=obj.ma.getNextStep();
		if (step==false) {
			window.clearInterval(obj.interval);
		} else {
		obj.src=magnetImagesArray[step].src;
		}
	}
}

function MagnetFields(imgDirectory) {
	magnetImagesArray=this.initMagnetImageArray(imgDirectory);
}

function initMagnetImageArray(imgDirectory) {
	var magnetImagesArray=new Array();
	for (i=0;i<180;i+=15) {
		magnetImagesArray[i]=magnetImagesArray[i+180]=new Image();
		magnetImagesArray[i].src=imgDirectory+'bg_'+i+'.gif';
		magnetImagesArray[i+180].src=imgDirectory+'bg_'+i+'.gif';
	}
	magnetImagesArray[360]=new Image();
	magnetImagesArray[360].src=imgDirectory+'bg_0.gif';
	return magnetImagesArray;
}

function setMagnetField(containerDivID,numOfImages) {
	var parentNode,imgNode;
	parentNode=document.getElementById(containerDivID);
	for (var i=0; i<numOfImages; i++) {
		imgNode=document.createElement("img");
		imgNode.setAttribute("src",magnetImagesArray[135].src);
		parentNode.appendChild(imgNode);
		imgNode.ma=new MagnetUnit(135);
		imgNode.onmouseover=animateMagnet;
		imgNode.onmousemove=animateMagnet;
		imgNode.onmouseout=returnToInitPos;
	}
}

MagnetFields.prototype.initMagnetImageArray=initMagnetImageArray;
MagnetFields.prototype.setMagnetField=setMagnetField;

magnetImagesArray=new Array();
