var weekId = 1;
var containerWidth = 914;
var viewtype = '';
var activity = '';
var planlevel = '';

Draggables.addObserver(new dragObserver());

function updatePlanName() {
	planId = $('hid_userplanid').getValue();
	planName = $('tbPlanName').getValue();

	//alert('Plan Id: ' + planId + ' \nPlan Name: ' + planName);

	new Ajax.Request('/user_plans/update_plan_name/' + planId + '/name:' + planName);
}

function createDraggable(elementId) {
	activity = $('hid_userplan_activity').getValue();
	planlevel = $('hid_userplan_level').getValue();
	viewtype = $('hid_userplan_viewtype').getValue();

	//new Draggable(elementId, {revert:true, handle:'daymoveicon', constraint:'horizontal', zindex:2000});
	new Draggable(elementId, {revert:true, handle:'daymoveicon', constraint:'horizontal', ghosting:true, zindex:2000});
}

function createDroppable(elementId) {
	Droppables.add(elementId, {accept: 'dragging', onDrop: function(element, droppableElement)
		{
			planDayDrop(element, droppableElement);
		}
	});
}

function dragObserver() {
	dragObserver.prototype.onStart = function(action, element, arg3) {
		planDayDragStart(action, element, arg3);
	}

	dragObserver.prototype.onEnd = function(action, element, arg3) {
		planDayDragStop(action, element, arg3);
	}
}

function planDayDragStart(action, element, arg3) {
	var dragElement = element.element;
	addClass(dragElement, 'dragging');

	//var dragSiblings = getMovableSiblings(dragElement);

	var weekList = dragElement.parentNode.parentNode;
	containerWidth = weekList.clientWidth;

	//Set weekid
	i = 0;
	while (i < weekList.childNodes.length)
    {
        var weekday = weekList.childNodes[i];
		if (weekday.tagName == 'INPUT' && hasClass(weekday, 'hidden_week_num'))
		{
			weekId = weekday.value;
			break;
		}

		i++;
	}

	var movableArray = new Array();
	movableArray = getMovableArray(weekList);

	var j = 2;
	dragIndex = 0;
	while (j < 9)
	{
		if ((movableArray[j][1].id == dragElement.id))
		{
			dragIndex = j;
			break;
		}
		j++;
	}

	var k = 2;
	while (k < 9)
	{
		if (movableArray[k][0] && (k != dragIndex))
		{
			if (testDroppability(movableArray, k, dragIndex))
			{
				movable = movableArray[k];
				addClass(movable[1], 'drophover');
				createDroppable(movable[1].id);
			}
		}
		k++;
	}
}

function planDayDragStop(action, element, arg3) {
	var dragElement = element.element;
	removeClass(dragElement, 'dragging');
	
	i = 0;
	while (i < Droppables.drops.length)
	{
		var dropElement = Droppables.drops[i].element;
		removeClass(dropElement, 'drophover');
		i++;
	}
	Droppables.drops.clear();
}

function planDayDrop(element, droppableElement) {
	var hidPlanId = document.getElementById('hid_userplanid').value;
	var dragOffset = element.id.substring(7,10);
	var dropOffset = droppableElement.id.substring(7,10);
	if (dragOffset != dropOffset)
	{
		new Ajax.Updater(document.createElement('div'),'/user_plans/day_swap/' + hidPlanId + '/weeknum:' + weekId + '/dragoffset:' + dragOffset + '/dropoffset:' + dropOffset, {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', element.id + ' ' + droppableElement.id + ' detailed_' + dragOffset + ' detailed_' + dropOffset]});
	}
}

function testDroppability(elementArray, index, dragIndex) {
	if (activity == 'Running' || activity == 'Cycling' || activity == 'Walking')
	{
		if ((planlevel == '1') || (planlevel == '2'))
		{
			//If its a single task being dragged
			if (elementArray[dragIndex][2] == 'singletask')
			{
				//Previous
				if ((elementArray[index - 1] != null) && (elementArray[index - 1][2] == 'singletask') && (elementArray[index - 1][1].id != elementArray[dragIndex][1].id))
				{
					return false;
				}
				//Next
				if ((elementArray[index + 1] != null) && (elementArray[index + 1][2] == 'singletask') && (elementArray[index + 1][1].id != elementArray[dragIndex][1].id))
				{
					return false;
				}
			}

			//If its a single task itself then it can't swap out with an item that has a single task next to it
			if (elementArray[index][2] == 'singletask')
			{
				//Previous dragItem
				if ((elementArray[dragIndex - 1] != null) && (elementArray[dragIndex - 1][2] == 'singletask') && (elementArray[dragIndex - 1][1].id != elementArray[index][1].id))
				{
					return false;
				}
				//After dragItem
				if ((elementArray[dragIndex + 1] != null) && (elementArray[dragIndex + 1][2] == 'singletask') && (elementArray[dragIndex + 1][1].id != elementArray[index][1].id))
				{
					return false;
				}
			}
		}
		else if (planlevel == '3')
		{
			//If its a single task being dragged
			if (elementArray[dragIndex][2] == 'singletask')
			{
				//Either side
				if ((elementArray[index - 1] != null) && (elementArray[index + 1] != null) && (elementArray[index - 1][2] == 'singletask') && (elementArray[index + 1][2] == 'singletask') && (elementArray[index - 1][1].id != elementArray[dragIndex][1].id) && (elementArray[index + 1][1].id != elementArray[dragIndex][1].id))
				{
					return false;
				}
				//2 previous
				if ((elementArray[index - 1] != null) && (elementArray[index - 2] != null) && (elementArray[index - 1][2] == 'singletask') && (elementArray[index - 2][2] == 'singletask') && (elementArray[index - 1][1].id != elementArray[dragIndex][1].id) && (elementArray[index - 2][1].id != elementArray[dragIndex][1].id))
				{
					return false;
				}
				//2 next
				if ((elementArray[index + 1] != null) && (elementArray[index + 2] != null) && (elementArray[index + 1][2] == 'singletask') && (elementArray[index + 2][2] == 'singletask') && (elementArray[index + 1][1].id != elementArray[dragIndex][1].id) && (elementArray[index + 2][1].id != elementArray[dragIndex][1].id))
				{
					return false;
				}
			}

			//If its a single task itself then it can't swap out and break the rules
			if (elementArray[index][2] == 'singletask')
			{
				//Either side
				if ((elementArray[dragIndex - 1] != null) && (elementArray[dragIndex + 1] != null) && (elementArray[dragIndex - 1][2] == 'singletask') && (elementArray[dragIndex + 1][2] == 'singletask') && (elementArray[dragIndex - 1][1].id != elementArray[index][1].id) && (elementArray[dragIndex + 1][1].id != elementArray[index][1].id))
				{
					return false;
				}
				//2 previous dragItem
				if ((elementArray[dragIndex - 1] != null) && (elementArray[dragIndex - 2] != null) && (elementArray[dragIndex - 1][2] == 'singletask') && (elementArray[dragIndex - 2][2] == 'singletask') && (elementArray[dragIndex - 1][1].id != elementArray[index][1].id) && (elementArray[dragIndex - 2][1].id != elementArray[index][1].id))
				{
					return false;
				}
				//2 after dragItem
				if ((elementArray[dragIndex + 1] != null) && (elementArray[dragIndex + 2] != null) && (elementArray[dragIndex + 1][2] == 'singletask') && (elementArray[dragIndex + 2][2] == 'singletask') && (elementArray[dragIndex + 1][1].id != elementArray[index][1].id) && (elementArray[dragIndex + 2][1].id != elementArray[index][1].id))
				{
					return false;
				}
			}
		}
	}
	else
	{
		if (elementArray[dragIndex][2] == 'exercise')
		{
			if (elementArray[dragIndex][3] == 'F')
			{
				//Previous
				if ((elementArray[index - 1] != null) && (elementArray[index - 1][2] == 'exercise') && (elementArray[index - 1][1].id != elementArray[dragIndex][1].id))
				{
					return false;
				}
				//Next
				if ((elementArray[index + 1] != null) && (elementArray[index + 1][2] == 'exercise') && (elementArray[index + 1][1].id != elementArray[dragIndex][1].id))
				{
					return false;
				}
			}
			else if (elementArray[dragIndex][3] == 'L')
			{
				//Previous
				if ((elementArray[index - 1] != null) && (elementArray[index - 1][2] == 'exercise') && ((elementArray[index - 1][3] == 'L') || (elementArray[index - 1][3] == 'F')) && (elementArray[index - 1][1].id != elementArray[dragIndex][1].id))
				{
					return false;
				}
				//Next
				if ((elementArray[index + 1] != null) && (elementArray[index + 1][2] == 'exercise') && ((elementArray[index + 1][3] == 'L') || (elementArray[index + 1][3] == 'F')) && (elementArray[index + 1][1].id != elementArray[dragIndex][1].id))
				{
					return false;
				}
			}
			else if (elementArray[dragIndex][3] == 'U')
			{
				//Previous
				if ((elementArray[index - 1] != null) && (elementArray[index - 1][2] == 'exercise') && ((elementArray[index - 1][3] == 'U') || (elementArray[index - 1][3] == 'F')) && (elementArray[index - 1][1].id != elementArray[dragIndex][1].id))
				{
					return false;
				}
				//Next
				if ((elementArray[index + 1] != null) && (elementArray[index + 1][2] == 'exercise') && ((elementArray[index + 1][3] == 'U') || (elementArray[index + 1][3] == 'F')) && (elementArray[index + 1][1].id != elementArray[dragIndex][1].id))
				{
					return false;
				}
			}
		}
		//If its a exercise itself then it can't swap out and break the rules
		if (elementArray[index][2] == 'exercise')
		{
			if (elementArray[index][3] == 'F')
			{
				//Previous
				if ((elementArray[dragIndex - 1] != null) && (elementArray[dragIndex - 1][2] == 'exercise') && (elementArray[dragIndex - 1][1].id != elementArray[index][1].id))
				{
					return false;
				}
				//Next
				if ((elementArray[dragIndex + 1] != null) && (elementArray[dragIndex + 1][2] == 'exercise') && (elementArray[dragIndex + 1][1].id != elementArray[index][1].id))
				{
					return false;
				}
			}
			else if (elementArray[index][3] == 'L')
			{
				//Previous
				if ((elementArray[dragIndex - 1] != null) && (elementArray[dragIndex - 1][2] == 'exercise') && ((elementArray[dragIndex - 1][3] == 'L') || (elementArray[dragIndex - 1][3] == 'F')) && (elementArray[dragIndex - 1][1].id != elementArray[index][1].id))
				{
					return false;
				}
				//Next
				if ((elementArray[dragIndex + 1] != null) && (elementArray[dragIndex + 1][2] == 'exercise') && ((elementArray[dragIndex + 1][3] == 'L') || (elementArray[dragIndex + 1][3] == 'F')) && (elementArray[dragIndex + 1][1].id != elementArray[index][1].id))
				{
					return false;
				}
			}
			else if (elementArray[index][3] == 'U')
			{
				//Previous
				if ((elementArray[dragIndex - 1] != null) && (elementArray[dragIndex - 1][2] == 'exercise') && ((elementArray[dragIndex - 1][3] == 'U') || (elementArray[dragIndex - 1][3] == 'F')) && (elementArray[dragIndex - 1][1].id != elementArray[index][1].id))
				{
					return false;
				}
				//Next
				if ((elementArray[dragIndex + 1] != null) && (elementArray[dragIndex + 1][2] == 'exercise') && ((elementArray[dragIndex + 1][3] == 'U') || (elementArray[dragIndex + 1][3] == 'F')) && (elementArray[dragIndex + 1][1].id != elementArray[index][1].id))
				{
					return false;
				}
			}
		}
	}

	return true;
}

function getMovableArray(weekList) {
	var toReturn = new Array();

	//Previous weeks last two days
	if ((weekList.previousSibling != null && weekList.previousSibling.nodeType == 1) || (weekList.previousSibling.previousSibling != null && weekList.previousSibling.previousSibling.nodeType == 1))
	{
		previousWeek = (weekList.previousSibling.nodeType == 3) ? weekList.previousSibling.previousSibling : weekList.previousSibling;
		
		var z = 0;
		dayCount = 1;
		while (z < previousWeek.childNodes.length)
		{
			previousWeekDay = previousWeek.childNodes[z];
			if (previousWeekDay.tagName == 'LI' && !hasClass(previousWeekDay, 'weeknum'))
			{
				if (dayCount == 6)
				{
					toReturn[0] = getMovableFromLi(previousWeekDay);
				}
				else if (dayCount == 7)
				{
					toReturn[1] = getMovableFromLi(previousWeekDay);
					break;
				}

				dayCount++;
			}
			z++;
		}
	}
	else
	{
		toReturn[0] = null;
		toReturn[1] = null;
	}

	var y = 0;
	dayCount = 1;
	while (y < weekList.childNodes.length)
	{
		weekDay = weekList.childNodes[y];
		if (weekDay.tagName == 'LI' && !hasClass(weekDay, 'weeknum'))
        {
			toReturn[dayCount + 1] = getMovableFromLi(weekDay);
			dayCount++;
        }
        y++;
    }

	//Next weeks first two days...
	if ((weekList.nextSibling != null && weekList.nextSibling.nodeType == 1) || (weekList.nextSibling.nextSibling != null && weekList.nextSibling.nextSibling.nodeType == 1))
	{
		nextWeek = (weekList.nextSibling.nodeType == 3) ? weekList.nextSibling.nextSibling : weekList.nextSibling;
		//nextWeek = weekList.nextSibling.nextSibling;

		var c = 0;
		dayCount = 1;
		while (c < nextWeek.childNodes.length)
		{
			nextWeekDay = nextWeek.childNodes[c];
			if (nextWeekDay.tagName == 'LI' && !hasClass(nextWeekDay, 'weeknum'))
			{
				if (dayCount == 1)
				{
					toReturn[9] = getMovableFromLi(nextWeekDay);
				}
				else if (dayCount == 2)
				{
					toReturn[10] = getMovableFromLi(nextWeekDay);
					break;
				}

				dayCount++;
			}
			c++;
		}
	}
	else
	{
		toReturn[9] = null;
		toReturn[10] = null;
	}

	return toReturn;
}

function getMovableSiblings(element) {
	var toReturn = new Array();

	toReturn[0] = getPreviousMovableSibling(element);
	toReturn[1] = getNextMovableSibling(element);

	return toReturn;
}

function getPreviousMovableSibling(element) {
	if (element.parentNode.previousSibling != null)
	{
		return getMovableFromLi(element.parentNode.previousSibling);
	}
}

function getNextMovableSibling(element) {
	if (element.parentNode.nextSibling != null)
	{
		return getMovableFromLi(element.parentNode.nextSibling);
	}
}

function getMovableFromLi(element) {
	var toReturn = new Array();

	if (hasClass(element, 'past') || hasClass(element, 'non-plan-day'))
	{
		toReturn[0] = false;
	}
	else
	{
		toReturn[0] = true;
	}

	j = 0;
	while (j < element.childNodes.length)
	{
		var movable = element.childNodes[j];
		if (hasClass(movable, 'movable'))
		{
			toReturn[1] = movable;

			p = 0;
			while (p < movable.childNodes.length)
			{
				var hidden = movable.childNodes[p];

				if (hasClass(hidden, 'sessiontype'))
				{
					toReturn[2] = $(hidden.id).getValue();
				}
				
				if (hasClass(hidden, 'supportinginfo'))
				{
					toReturn[3] = hidden.getValue();
				}

				p++
			}
		}
			
		j++;
	}

	return toReturn;
}







function planDayDragDragging(action, element, arg3) {
	var dragElement = element.element;
	element.options.constraint = 'horizontal';

	if (dragElement.offsetLeft > (containerWidth - dragElement.clientWidth - 9))
	{
		leftValue = (containerWidth - dragElement.clientWidth - 9) + 'px';
		dragElement.setStyle({'left': leftValue});
		element.options.constraint = 'none';
	}

	if (dragElement.offsetLeft < (29))
	{
		dragElement.setStyle({'left': '29px'});
		element.options.constraint = 'none';
	}
}