// JavaScript Document
var maxWidth, maxHeight, maxTop, minLeft;

function matrix (r,c) {
	this.matrix = new Array(r);
	for(var i = 0; i < this.matrix.length; i++)
		this.matrix[i] = new Array(c);
}
matrix.prototype.setEntryValue = function(value, r , c) {
	this.matrix[r][c] = value;
}
matrix.prototype.setRowValue = function(array, r) {
	this.matrix[r] = array;
}
matrix.prototype.setMatrix = function(matrix) {
	this.matrix = matrix;
}
matrix.prototype.getEntryValue = function(r , c) {
	return this.matrix[r][c];
}
matrix.prototype.getRowValue = function(r) {
	return this.matrix[r];
}
matrix.prototype.getMatrix = function() {
	return this.matrix;
}



document.onmousemove = mouseMove;
document.onmouseup   = mouseUp;

var dragObject  = resize = origMousePos = lastMousePos = porportion = norm = dragDimension = theta = null;

function getMouseOffset(target, ev){
	ev = ev || window.event;
	var mousePos  = mouseCoords(ev);
	if(isArray(target)) {
		offSet = new matrix(target.length, 2);
		for(var i = 0; i < dragObject.length; i++) {
			docPos = new Array(2);
			docPos = getPosition(target[i]);
			tempX = parseFloat(mousePos.x) - parseFloat(docPos.x);
			tempY = parseFloat(mousePos.y) - parseFloat(docPos.y);			
			
			offSet.setEntryValue(tempX, i, 0);
			offSet.setEntryValue(tempY, i, 1);
		}
		return offSet;
	} else 	{
		var docPos    = getPosition(target);
			tempX = parseFloat(mousePos.x) - parseFloat(docPos.x);
			tempY = parseFloat(mousePos.y) - parseFloat(docPos.y);		
		return {x:tempX, y:tempY};
	}
}

function getPosition(e){
	var left = 0;
	var top  = 0;
	
	try {
		if(e.style.left) {
			return {x:e.style.left, y: e.style.top};
		}
	} catch(e) { }
		
	while (e.offsetParent){
		left += e.offsetLeft;
		top  += e.offsetTop;
		e     = e.offsetParent;
	}
	return {x:left, y:top};
}

function isArray(obj) {
   if (obj.constructor.toString().indexOf("Array") == -1)
      return false;
   else
      return true;
}

var additionalMove = false;

function mouseMove(ev){
	ev           = ev || window.event;
	if(dragObject){
		var mousePos = mouseCoords(ev);
		if(isArray(dragObject)) {
			for(var i = 0; i < dragObject.length; i++) {
				if(origMousePos) {
					a = parseFloat(mousePos.x) - parseFloat(dragDimension.getEntryValue(i,3));
					b = parseFloat(mousePos.y) - parseFloat(dragDimension.getEntryValue(i,4));
					c = Math.sqrt(a^2 + b^2);
					beta = Math.atan(b/a);
					gamma = beta - theta;
					
					cProjm = c * Math.cos(gamma);					
					
					multiple = cProjm/dragDimension.getEntryValue(i,2);
					dragObject[i].style.height   = (parseFloat(mousePos.y) - parseFloat(findPosY(dragObject[i]))) + 'px';
					dragObject[i].style.width	 =  parseFloat(dragObject[i].style.height) /  parseFloat(porportion[i]) + 'px';
				} else {
					dragObject[i].style.position = 'absolute';
					dragObject[i].style.top      = (mousePos.y - mouseOffset.getEntryValue(i, 1)) + 'px';
					dragObject[i].style.left     = (mousePos.x - mouseOffset.getEntryValue(i, 0)) + 'px';
				}
			}
		} else {
			if(origMousePos) {
				add = mousePos.x - origMousePos.x;
				origMousePos.x = mousePos.x;
				dragObject.style.width    = dragObject.offsetWidth + add + 'px';
				dragObject.style.height   = dragObject.offsetWidth * porportion + 'px';
			} else {
				var leftOffset = (mousePos.x - dragObject.style.left);
				dragObject.style.position = 'absolute';
				dragObject.style.top      = (mousePos.y - mouseOffset.y) + 'px';
				dragObject.style.left     = (mousePos.x - mouseOffset.x) + 'px';
			}
		}
		if(origMousePos) {
			if(additionalMove) {
				additionalMove();
			}
		}
		return false;
	}
}
function mouseUp(){
	dragObject  = resize = origMousePos = lastMousePos = porportion = norm = dragDimension = null;
	maxWidth = maxHeight = maxTop = minLeft = null;
}

function makeDraggable(dItem, handler, resize){
	if(!dItem) return;
	handler.onmousedown = function(ev){
		dragObject  = dItem;
		mouseOffset = getMouseOffset(dItem, ev);
		
		if(resize) {
			origMousePos =  mouseCoords(ev);
			if(isArray(dragObject)) {
				porportion = new Array(dragObject.length);
				norm = new matrix(dragObject.length, 2);
				dragDimension = new matrix(dragObject.length, 5);
				
				var c = null;
				for(var i = 0; i < dragObject.length; i++) {
					porportion[i] = dragObject[i].offsetHeight/dragObject[i].offsetWidth;
					c = Math.sqrt(1 + porportion[i]^2);
					norm.setEntryValue(1/c,i,0);
					norm.setEntryValue(porportion[0]/c,i,1);	
					theta = Math.atan(dragObject[i].offsetHeight/dragObject[i].offsetWidth);
					dragDimension.setEntryValue(dragObject[i].offsetWidth,i,0);
					dragDimension.setEntryValue(dragObject[i].offsetHeight,i,1);
					dragDimension.setEntryValue(Math.sqrt(dragObject[i].offsetHeight^2 + dragObject[i].offsetWidth^2),i,2);
					dragDimension.setEntryValue(dragObject[i].style.left,i,3);
					dragDimension.setEntryValue(dragObject[i].style.top,i,4);
				}
			} else {
				porportion = resize;
				var c = Math.sqrt(1 + resize^2);
				norm['x'] = 1/c;
				norm['y'] = resize/c;
				dragDimension[x] = dragObject[i].offsetWidth;
				dragDimension[y] = dragObject[i].offsetHeight;
				dragDimension[c] = Math.sqrt(dragObject[i].offsetHeight^2 + dragObject[i].offsetWidth^2);
			}
		}
		return false;
	}
}

function mouseCoords(ev){
	if(ev.pageX || ev.pageY){
		return {x:ev.pageX, y:ev.pageY};
	}
	return {	
		x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
		y:ev.clientY + document.body.scrollTop  - document.body.clientTop
	};
}

