﻿// JScript File
var isDragging = false;
var draggingID;
var x, y;
var tx, ty;
var orgX, orgY;
var dObj;
var zIndex = 100;
var arrPB;
var draggableBox;
var previousHoverContainer;
var previousHoverBox;
var openBoxes = new Array();
var topMouseDiff = 0;

var topBlock = 133;
var bottomBlock = 646;
var bottomBlockDiff = 0;

var checkForMove = false;

var theItemCount;
var theElField;

function toggleInfo(el)
{
	var children = el.getElementsByTagName('div');
	
	while(openBoxes.length > 0)
	{
		var elClose = document.getElementById(openBoxes.pop());
		
		if(elClose.id != el.id)
		{
			var closeChildren = elClose.getElementsByTagName('div');
			closeChildren[4].style.display = 'none';
			closeChildren[0].getElementsByTagName('img')[0].src = '/Images/arrowright.gif';
			bottomBlockDiff = 0;
		}
	}
	
	if(children[1].innerHTML.length > 0)
		if(children[4].style.display == '')
		{
			children[4].style.display = 'none';
			children[0].getElementsByTagName('img')[0].src = '/Images/arrowright.gif';
			bottomBlockDiff = 0;
		}
		else
		{
			openBoxes.push(el.id);
			children[4].style.display = '';
			children[0].getElementsByTagName('img')[0].src = '/Images/arrowdown.gif';
			bottomBlockDiff = parseInt(children[4].offsetHeight);
			//alert(children[4].offsetHeight);
		}
		
	registerObjects();
}

function getRectangle(obj)
{
	var curleft = curtop = 0;
	var width = obj.offsetWidth;
	var height = obj.offsetHeight;
	
	if (obj.offsetParent)
	{
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		
		while (obj = obj.offsetParent)
		{
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	
	return [curleft,curtop,curleft+width,curtop+height];
}

function findParentElementByClass(obj, className)
{
	var el = obj;
	
	if(el != null)
	{
		while(el.className != className && el.parentNode)
			el = el.parentNode;
				
		if(el.className == className)
			return el;
		else
			return null;
	}
	else
		return null;
}

function getPriorityBoxFromCoords(mouseX, mouseY)
{
	mouseX = mouseX + document.documentElement.scrollLeft;
	mouseY = mouseY + document.documentElement.scrollTop;

	for(i=0; i<arrPB.length; i++)
	{
		if(arrPB[i].id != draggingID)
		{
			var coord = getRectangle(arrPB[i]);
			var pbX1 = coord[0];
			var pbY1 = coord[1];
			var pbX2 = coord[2];
			var pbY2 = coord[3];
			
			if(mouseX >= pbX1 && mouseX <= pbX2 && mouseY >= pbY1 && mouseY <= pbY2)
				return arrPB[i];
		}
	}
	
	return null;
}

function getPriorityFromPriorityBox(el)
{
	return el.parentNode.getElementsByTagName('div')[0].innerHTML;
}

function registerObjects()
{
	arrPB = new Array();
	draggableBox = new Array();
	
	var divs = document.getElementsByTagName("div");
	
	for(i=0; i<divs.length; i++)
		if(divs[i].className == "priorityBox")
		{
			arrPB.push(divs[i]);
			draggableBox[getPriorityFromPriorityBox(divs[i])] = divs[i].parentNode;
		}
}

function registerPrioritization(message)
{
	if (checkForMove != true)
	{
		alert(message);
		return false;
	}

	var elField = document.getElementById(theElField);
	
	elField.value = "";
	
	for(i=1; i<=theItemCount; i++)
		if(elField.value.length == 0)
			elField.value = draggableBox[i].getElementsByTagName('div')[1].id.split('pb')[1];
		else
			elField.value += ',' + draggableBox[i].getElementsByTagName('div')[1].id.split('pb')[1];
}

document.onmousedown = function(e)
{
	var el = (!document.all) ? e.target : event.srcElement;
	var ev = (!document.all) ? e : event;
	
	el = findParentElementByClass(el, 'priorityBox');
	previousHoverContainer = findParentElementByClass(el, 'priorityDraggableBox');
	
	// We've found a draggable box
	if(el != null && previousHoverContainer != null)
	{
		isDragging = true;
		draggingID = el.id;
		
		dObj = el;
		dObj.style.zIndex = zIndex++;
		dObj.className = 'priorityBoxDragged';
		
		x = (!document.all) ? e.clientX : event.clientX;
		y = (!document.all) ? e.clientY : event.clientY;
		
		orgX = x;
		orgY = y;
		
		tx = parseInt(dObj.style.left+0);
		ty = parseInt(dObj.style.top+0);
		
		// Set inner difference
		topMouseDiff = y - dObj.offsetTop;
	}
}

document.onmousemove = function(e)
{
	var theBottomBlock = 0;
	
	theBottomBlock = bottomBlock + bottomBlockDiff;

	if(isDragging)
	{
		var acx = ((!document.all) ? e.clientX : event.clientX);
		var acy = ((!document.all) ? e.clientY : event.clientY);
		var cx = ((!document.all) ? e.clientX - x : tx + event.clientX - x);
		var cy = ((!document.all) ? e.clientY - y : ty + event.clientY - y);
		
		// Block top and bottom edge
		if (acy > topBlock + topMouseDiff && acy < theBottomBlock + topMouseDiff)
			dObj.style.top = cy + 'px';
		else if (acy <= topBlock)
			dObj.style.top = (topBlock - y) + topMouseDiff + 'px';
		else if (acy >= bottomBlock)
			dObj.style.top = (theBottomBlock - y) + topMouseDiff + 'px';
			
		dObj.focus();
		
		var hoverElement = getPriorityBoxFromCoords(acx, acy);
		
		if(hoverElement != null)
		{
			if(previousHoverBox != null && previousHoverBox.id != hoverElement.id && previousHoverBox.style.backgroundColor != '#e9eef1')
				previousHoverBox.style.backgroundColor = '';
			
			previousHoverBox = hoverElement;
			
			if(hoverElement.style.backgroundColor != '#e9eef1')
				hoverElement.style.backgroundColor = '#DDDDDD';
		}
		else
		{
			if(previousHoverBox != null && previousHoverBox.style.backgroundColor != '#e9eef1')
				previousHoverBox.style.backgroundColor = '';
		}
				
		
		return false;
	}
}

document.onmouseup = function(e)
{
	if(previousHoverBox != null && previousHoverBox.style.backgroundColor != '#e9eef1')
		previousHoverBox.style.backgroundColor = '';

	if(isDragging)
	{
		// Change back priority box class
		dObj.className = 'priorityBox';
		
		isDragging = false;
		
		// Get mouse coordinates
		var acx = ((!document.all) ? e.clientX : event.clientX);
		var acy = ((!document.all) ? e.clientY : event.clientY);
		
		// Get possible hover element
		var hoverElement = getPriorityBoxFromCoords(acx, acy);
		
		// If we have a hover element, switch places, otherwise we pop the dragged box back to its previous position
		if(hoverElement != null)
		{
			// Get the from and to locations
			var from = parseInt(getPriorityFromPriorityBox(dObj));
			var to = parseInt(getPriorityFromPriorityBox(hoverElement));
			
			// Copy the dragbox to the hovered elements location
			var newElement = dObj.cloneNode(true);
			
			// Set the new elements relative position to (0,0)
			newElement.style.left = '0px';
			newElement.style.top = '0px';
			newElement.style.backgroundColor = '#E9EEF1';
			
			// Remove dragged object from parent
			dObj.parentNode.removeChild(dObj);
			
			// Add new element to parent objects container
			hoverElement.parentNode.appendChild(newElement);
			
			// Depending on move direction, move other elements up/down
			if(from < to)
			{
				// Moving from (ex) 1 => 10
				for(i=to; parseInt(i)>from; i--)
				{
					var copyEl = draggableBox[i].getElementsByTagName('div')[1].cloneNode(true);
					draggableBox[parseInt(i) - 1].appendChild(copyEl);
					draggableBox[i].removeChild(draggableBox[i].getElementsByTagName('div')[1]);
				}
				
				checkForMove = true;
			}
			else
			{
				// Moving from (ex) 10 => 1
				for(i=to; parseInt(i)<from; i++)
				{
					var copyEl = draggableBox[i].getElementsByTagName('div')[1].cloneNode(true);
					draggableBox[parseInt(i) + 1].appendChild(copyEl);
					draggableBox[i].removeChild(draggableBox[i].getElementsByTagName('div')[1]);
				}
				
				checkForMove = true;
			}
			
			// Register new priority box locations
			registerObjects();
		}
		else
		{
			dObj.style.left = (tx + orgX - x) + 'px';
			dObj.style.top = (ty + orgY - y) + 'px';
		}
	}
}

