
function addLoadListener(fn)
{
	if(typeof window.addEventListener != 'undefined')
	{
		window.addEventListener('load', fn, false);
	}
	else if(typeof document.addEventListener != 'undefined')
	{
		document.addEventListener('load', fn, false);
	}
	else if(typeof window.attachEvent != 'undefined')
	{
		window.attachEvent('onload', fn);
	}
	else
	{
		return false;
	}
	
	return true;
};

function attachEventListener(target, eventType, functionRef, capture)
{
    if(typeof target.addEventListener != "undefined")
    {
        target.addEventListener(eventType, functionRef, capture);
    }
    else if(typeof target.attachEvent != "undefined")
    {
        target.attachEvent("on" + eventType, functionRef);
    }
    else
    {
        return false;
    }

    return true;
};

function detachEventListener(target, eventType, functionRef, capture)
{
    if(typeof target.removeEventListener != "undefined")
    {
        target.removeEventListener(eventType, functionRef, capture);
    }
    else if(typeof target.detachEvent != "undefined")
    {
        target.detachEvent("on" + eventType, functionRef);
    }
    else
    {
        return false;
    }

    return true;
};

function hasClass(target, classValue)
{
	var pattern = new RegExp("(^| )" + classValue + "( |$)");

	if(target.className.match(pattern))
	{
		return true;
	}

	return false;
};

function addClass(target, classValue)
{
	if(!hasClass(target, classValue))
	{
		if(target.className == "")
		{
			target.className = classValue;
		}
		else
		{
			target.className += " " + classValue;
		}
	}

	return true;
};

function removeClass(target, classValue)
{
	var removedClass = target.className;
	var pattern = new RegExp("(^| )" + classValue + "( |$)");

	removedClass = removedClass.replace(pattern, "$1");
	removedClass = removedClass.replace(/ $/, "");

	target.className = removedClass;

	return true;
};



addLoadListener(initModular);

function initModular()
{
	if(!document.getElementsByClassName('reservation_container')) return false;
	
	var modules = document.getElementsByClassName('reservation_container');
	for(var i = 0; i < modules.length; i++)
	{
		var u = document.getElementsByClassName('current_user_reservations');

		for(var j = 0; j < u.length; j++)
		{
			var s = u[j].getElementsByTagName('span')[0];
			addClass(s,'draggable');
			attachEventListener(s,'mousedown',mousedownU,false);
			s.onmouseover = function()
			{
				srr.active = false;
			};
		}
	}
	
	return true;
};

function mousedownU(event)
{
	srr.active = false;
	if(typeof event == 'undefined')
	{
		event = window.event;
	}
	
	if(typeof event.target != 'undefined')
	{
		dragTarget = event.target.parentNode;
		//dragTarget = event.target;
	}
	else
	{
		dragTarget = event.srcElement.parentNode;
		//dragTarget = event.srcElement;
	}

	dragOrigin = [event.clientX, event.clientY];
	dragHotspots = [];

	var modules = document.getElementsByClassName('reservation_container');
	for(var i = 0; i < modules.length; i++)
	{
		var li = modules[i].getElementsByTagName('li');
		
		for(var j = 0; j < li.length; j++)
		{
			if(li[j] != null && hasClass(li[j],'open'))
			{
				var modulePosition = getPosition(li[j]);
				
				dragHotspots[dragHotspots.length] =
				{
					element: li[j],
					offsetX: modulePosition[0],
					offsetY: modulePosition[1]
				}
			}
		}
		
		var modulePosition = getPosition(modules[i]);
		
		dragHotspots[dragHotspots.length] =
		{
			element: modules[i],
			offsetX: modulePosition[0],
			offsetY: modulePosition[1] + modules[i].offsetHeight
		}
	}
	
	var position = getPosition(dragTarget);
	
	var ghost = document.createElement('div');
	ghost.setAttribute('id','ghost');
	document.getElementsByTagName('body')[0].appendChild(ghost);

	ghost.appendChild(dragTarget.cloneNode(true));
	ghost.style.left = (1 + position[0]) + 'px';
	ghost.style.top = (1 + position[1]) + 'px';
	
	attachEventListener(document,'mousemove',mousemoveDocument,false);
	attachEventListener(document,'mouseup',mouseupDocument,false);
	
	event.returnValue = false;

	if(typeof event.preventDefault != 'undefined')
	{
		event.preventDefault();
	}

	return true;
};

function mousemoveDocument(event)
{
	srr.active = false;
	if(typeof event == 'undefined')
	{
		event = window.event;
	}
	
	var ghost = document.getElementById('ghost');
	
	if(ghost != null)
	{
		ghost.style.marginLeft = event.clientX - dragOrigin[0] + 'px';
		ghost.style.marginTop = event.clientY - dragOrigin[1] + 'px';
	}
	
	var closest = null;
	var closestY = null;
	
	for(var i in dragHotspots)
	{
		var ghostX = parseInt(ghost.style.left, 10) + parseInt(ghost.style.marginLeft, 10);
		var ghostY = parseInt(ghost.style.top, 10) + parseInt(ghost.style.marginTop, 10);
		
		if(ghostX >= dragHotspots[i].offsetX - ghost.offsetWidth && ghostX <= dragHotspots[i].offsetX + dragHotspots[i].element.offsetWidth)
		{
			var distanceY = Math.abs(ghostY - dragHotspots[i].offsetY);
			
			if(closestY == null || closestY > distanceY)
			{
				closest = dragHotspots[i];
				closestY = distanceY;
			}
		}
	}
	
	if(closest != null)
	{
		var ghostmarker = document.getElementById('ghostmarker');
		
		if(ghostmarker == null)
		{
			ghostmarker = document.createElement('div');
			ghostmarker.id = 'ghostmarker';
			ghostmarker.className = dragTarget.className;
			document.getElementsByTagName('body')[0].appendChild(ghostmarker);
		}
		
		ghostmarker.marked = closest.element;
		
		ghostmarker.style.left = (closest.offsetX) + 'px';
		ghostmarker.style.top = (1 + closest.offsetY) + 'px';
	}
	else
	{
		var ghostmarker = document.getElementById('ghostmarker');
		
		if(ghostmarker != null)
		{
			ghostmarker.parentNode.removeChild(ghostmarker);
		}
		
	}
	
	event.returnValue = false;

	if(typeof event.preventDefault != 'undefined')
	{
		event.preventDefault();
	}

	return true;
};

function mouseupDocument()
{
	srr.active = false;
	detachEventListener(document,'mousemove',mousemoveDocument,false);
	detachEventListener(dragTarget,'mousedown',mousedownU,false);
	
	var ghost = document.getElementById('ghost');
	
	if(ghost != null)
	{
		ghost.parentNode.removeChild(ghost);
	}
	
	var ghostmarker = document.getElementById('ghostmarker');
	
	if(ghostmarker != null)
	{
		ghostmarker.marked.className = ghostmarker.marked.className.replace('open','reserving');
		ghostmarker.marked.input.checked = true;
		dragTarget.className = dragTarget.className.replace('reserved','open');
		addClass(dragTarget,'open');
		removeClass(dragTarget,'reserving');
		removeClass(dragTarget,'current_user_reservations');
		//removeClass(dragTarget,'draggable');
		//ghostmarker.marked.onmousedown = null;
		//ghostmarker.marked.onmousemove = null;
		//ghostmarker.marked.onmouseup = null;
		attachEventListener(ghostmarker.marked.getElementsByTagName('span')[0],'mousedown',mousedownU,false);
		addClass(ghostmarker.marked.getElementsByTagName('span')[0],'draggable');
		//ghostmarker.marked.appendChild(document.createTextNode(dragTarget.input.value));
		ghostmarker.marked.input.value = dragTarget.input.value;
		dragTarget.input.value = 'Y';
		//dragTarget.removeChild(dragTarget.lastChild);
		removeClass(dragTarget.getElementsByTagName('span')[0],'draggable');
		srr.active = false;
				
		ghostmarker.parentNode.removeChild(ghostmarker);
	}
	
	return true;
};

function getPosition(theElement)
{
	var positionX = 0;
	var positionY = 0;

	while (theElement != null)
	{
		positionX += theElement.offsetLeft;
		positionY += theElement.offsetTop;
		theElement = theElement.offsetParent;
	}

	return [positionX, positionY];
};
