
function fly(){
	this.flyDelay = 10;
	this.divFactor = 50;
	this.moveIndex = 0;

	this.startFly = startFly;
	this.moveObj = moveObj;
	this.moveX = moveX;
	this.moveY = moveY;
	this.waiting = waiting;

	this.flyStopFn = new Array();
	this.flyX = new Array();
	this.flyY = new Array();
	this.flyTime = new Array();

	this.flyId = '';
	this.stopId = 'cart';
	this.dummyId = '';
	this.dummyref = 'flydummy';
	this.waitAxis = 'x';		// x | y
	this.axisFactor = 100;
	this.currency = '&pound;';

}
function findPosX(obj) {
	var curleft = 0;
	if (obj.offsetParent) 	{
		while (obj.offsetParent) {
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x) {
		curleft += obj.x;
	}
	return curleft;
}
function findPosY(obj) {
	var curtop = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.x) {
		curtop += obj.x;
	}
	return curtop;
}
function startFly(){

	var flyObj = document.getElementById(this.flyId);
	var refDummyObj = document.getElementById(this.dummyref);
	var flyDummyObj = document.getElementById(this.dummyId);
	if(flyDummyObj) {
		alert('Previous request is still in queue.');
		return false;
	}else{
		var flyDummyObj = document.createElement('DIV');
		flyDummyObj.style.position ="absolute";
		refDummyObj.parentNode.appendChild(flyDummyObj);
		flyDummyObj.id = this.dummyId;
	}
	flyDummyObj.style.zIndex = 1;
	flyDummyObj.innerHTML = flyObj.innerHTML;

	flyDummyObj.style.top = findPosY(flyObj);
	flyDummyObj.style.left = findPosX(flyObj);

	var flyStopObj = document.getElementById(this.stopId);

	var distX = findPosX(flyStopObj) - findPosX(flyObj);
	var distY = findPosY(flyStopObj) - findPosY(flyObj);

	var startX = findPosX(flyObj);
	var startY = findPosY(flyObj);

	var stopX = findPosX(flyStopObj);
	var stopY = findPosY(flyStopObj);

	var stepX = distX / this.divFactor;
	var stepY = distY / this.divFactor;

	this.flyX.length = 0;
	this.flyY.length = 0;
	for(var i=0; i<= this.divFactor; i++) {
		this.flyX[i] = Math.round(startX + (stepX*i));
		this.flyY[i] = Math.round(startY + (stepY*i));
	}
	this.moveIndex = 0;
	clearTimeout(this.flyTime[this.flyId]);
	var flyObject = this;
	this.flyTime[this.flyId] = setTimeout(function(evt) { moveObj(flyObject); }, this.flyDelay);
}

function moveObj(obj){
	var flyingObj = document.getElementById(obj.dummyId);
	flyingObj.style.left = obj.flyX[obj.moveIndex] + 'px';
	flyingObj.style.top = obj.flyY[obj.moveIndex] + 'px';
	var flyStopObj = document.getElementById(obj.stopId);
	obj.moveIndex++;

	if(obj.moveIndex == obj.flyX.length) {
		if((findPosX(flyStopObj) != findPosX(flyingObj)) || (findPosY(flyStopObj) != findPosY(flyingObj))){

			var flyObject = obj;

			var flyObj = document.getElementById(obj.dummyId);

			var distX = findPosX(flyStopObj) - findPosX(flyObj);
			var distY = findPosY(flyStopObj) - findPosY(flyObj);

			var startX = findPosX(flyObj);
			var startY = findPosY(flyObj);

			var stopX = findPosX(flyStopObj);
			var stopY = findPosY(flyStopObj);

			var stepX = distX / obj.divFactor;
			var stepY = distY / obj.divFactor;
			
			for(var i=0; i<= obj.divFactor; i++) {
				obj.flyX[i] = Math.round(startX + (stepX*i));
				obj.flyY[i] = Math.round(startY + (stepY*i));
			}

			clearTimeout(obj.flyTime[obj.flyId]);
			obj.flyTime[obj.flyId] = setTimeout(function(evt) { flyObject.moveIndex=0; moveObj(flyObject); }, obj.flyDelay);


		}else{
			var flyObj = document.getElementById(obj.dummyId);

			var distX = (obj.waitAxis == 'x') ? obj.axisFactor : 0;
			var distY = (obj.waitAxis == 'y') ? obj.axisFactor : 0;

			var startX = 0;
			var startY = 0;

			var stopX = startX + distX;
			var stopY = startY + distY;

			var stepX = distX / obj.axisFactor;
			var stepY = distY / obj.axisFactor;

			for(var i=0; i<= obj.axisFactor; i++) {
				obj.flyX[i] = Math.round(startX + (stepX*i));
				obj.flyY[i] = Math.round(startY + (stepY*i));
			}
			obj.moveIndex=0;
			obj.waiting();
			for(var i=0; i<obj.flyStopFn.length; i++) {
				eval(obj.flyStopFn[i] + '(obj)');
			}
		}
	}else {
		flyObject = obj;
		clearTimeout(obj.flyTime[obj.flyId]);
		obj.flyTime[obj.flyId] = setTimeout(function(evt) { moveObj(flyObject); }, obj.flyDelay);
	}
}
function moveX(obj){
	var flyStopObj = document.getElementById(obj.stopId);
	var flyingObj = document.getElementById(obj.dummyId);
	flyingObj.style.left = parseInt(findPosX(flyStopObj) + obj.flyX[obj.moveIndex]) + 'px';
	flyingObj.style.top = findPosY(flyStopObj) + 'px';
	flyObject = obj;
	clearTimeout(obj.flyTime[obj.flyId]);
	obj.flyTime[obj.flyId] = setTimeout(function(evt) { 
		if(flyObject.waitAxis == 'x')	
			moveX(flyObject);
		else 
			moveY(flyObject);

	}, obj.flyDelay);
	obj.moveIndex++;
	if(obj.moveIndex == obj.axisFactor) {
		obj.moveIndex = 0;
		obj.flyX = obj.flyX.reverse();
		obj.flyY = obj.flyY.reverse();
	}
}
function moveY(obj){
	var flyStopObj = document.getElementById(obj.stopId);
	var flyingObj = document.getElementById(obj.dummyId);
	flyingObj.style.top = parseInt(findPosY(flyStopObj) + obj.flyY[obj.moveIndex]) + 'px';
	flyingObj.style.left = findPosX(flyStopObj) + 'px';
	flyObject = obj;
	clearTimeout(obj.flyTime[obj.flyId]);
	obj.flyTime[obj.flyId] = setTimeout(function(evt) { 
		if(flyObject.waitAxis == 'x')	
			moveX(flyObject);
		else 
			moveY(flyObject);

	}, obj.flyDelay);
	obj.moveIndex++;
	if(obj.moveIndex == obj.axisFactor) {
		obj.moveIndex = 0;
		obj.flyX = obj.flyX.reverse();
		obj.flyY = obj.flyY.reverse();
	}
}
function waiting(){
	var flyObject = this;
	clearTimeout(this.flyTime[this.flyId]);
	this.flyTime[this.flyId] = setTimeout(function(evt) { 
		if(flyObject.waitAxis == 'x')	
			moveX(flyObject);
		else 
			moveY(flyObject);

	}, this.flyDelay);
}