/**************************************************
 * dom-drag.js
 * 09.25.2001
 * www.youngpup.net
 **************************************************
 * 10.28.2001 - fixed minor bug where events
 * sometimes fired off the handle, not the root.
 **************************************************
 * 05.30.2005 - added a workaround for firefox
 * activating links when finished dragging.
 * mmosier@astrolabe.com
 **************************************************/

var Drag = {

	obj : null,

	init : function(o, oRoot, minX, maxX, minY, maxY)
	{
		o.onmousedown = Drag.start;

		o.minX = minX;
		o.minY = minY;
		o.maxX = maxX;
		o.maxY = maxY;

		o.root = oRoot != null ? oRoot : o;

		o.root.onDragStart = new Function();
		o.root.onDragEnd   = new Function();
		o.root.onDrag      = new Function();
	},

	start : function(e)
	{
		deselect();	
		e = Drag.fixE(e);
		
		if (e.button != 1 && e.which != 1)
			return;

		var o = Drag.obj = this;
		var y = parseInt(o.root.style.top );
		var x = parseInt(o.root.style.left);
		o.root.style.zIndex = 1;
		o.root.onDragStart(x, y);

		o.lastMouseX	= e.clientX;
		o.lastMouseY	= e.clientY;

		if (o.minX != null)	o.minMouseX	= e.clientX - x + o.minX;
		if (o.maxX != null)	o.maxMouseX	= o.minMouseX + o.maxX - o.minX;
		if (o.minY != null)	o.minMouseY	= e.clientY - y + o.minY;
		if (o.maxY != null)	o.maxMouseY	= o.minMouseY + o.maxY - o.minY;

		document.onmousemove = Drag.drag;
		document.onmouseup   = Drag.end;

		return false;
	},

	drag : function(e)
	{
		e = Drag.fixE(e);
		var o = Drag.obj;
		var or = o.root;

		var ex = e.clientX;
		var ey = e.clientY;
		var y = parseInt(or.style.top);
		var x = parseInt(or.style.left);

		if (o.minX != null) ex = Math.max(ex, o.minMouseX);
		if (o.maxX != null) ex = Math.min(ex, o.maxMouseX);
		if (o.minY != null) ey = Math.max(ey, o.minMouseY);
		if (o.maxY != null) ey = Math.min(ey, o.maxMouseY);

		nx = x + ex - o.lastMouseX;
		ny = y + ey - o.lastMouseY;

		or.style["left"] = nx + "px";
		or.style["top"] = ny + "px";
		o.lastMouseX = ex;
		o.lastMouseY = ey;

		or.onDrag(nx, ny, or);
		return false;
	},

	end : function()
	{
		var or = Drag.obj.root;
		document.onmousemove = null;
		document.onmouseup   = null;
		or.onDragEnd(parseInt(or.style["left"]), parseInt(or.style["top"]), or);
		Drag.obj = null;
	},

	fixE : function(e)
	{
		if (typeof e == 'undefined') e = window.event;
		return e;
	}
};

function deselect()
{
	if (document.selection)
		document.selection.empty();
	else if (window.getSelection)
		window.getSelection().removeAllRanges();
}

/**************************************************
 * (c) Copyright, DTLink, LLC 1997-2005
 *     http://www.dtlink.com
 *
 * DragList - Drag and Drop Ordered Lists
 *
 * Javascript Support file for formVista <draglist> fvml tag.
 *
 * For more information please see:
 *
 *    http://www.formvista.com/otherprojects/draglist.html
 *
 * For questions or comments please contact us at:
 *
 *     http://www.formvista.com/contact.html
 *
 * LICENSE: This file is governed by the new BSD license. For more information
 * please see the LICENSE.txt file accompanying this package. 
 *
 * REVISION HISTORY:
 *
 * 2004-11-12 YmL:
 *	.	initial revision.
 *
 * 2005-05-28 YmL:
 *	.	pulled out of formVista, relicensed and packaged as a standalone implementation.
 *
 * 2005-06-02 mtmosier:
 *	.	added horizontal dragging support.
 *
 **************************************************/

var dragListIndex = new Array();

// constructor for dragList class
function fv_dragList(name)
{
	// name of this dragList. Must match the id of the root DIV tag.
	this.dragListRootId = name;

	// array of item offsets
	this.offsetsY = new Array();
	// array of div heights
	this.divheights = new Array();
}

// setup the draglist prior to use
fv_dragList.prototype.setup = function(itemTagName)
{
	this.listRoot = document.getElementById(this.dragListRootId);
	this.listItems = this.getListItems(itemTagName);

	for (var i = 0; i < this.listItems.length; i++) 
	{
		if (this.listItems[i] == undefined)
			continue;

		var minY = 0;
		for (var j = 0; j < i; j++)
			minY = minY - this.getDivHeight(this.listItems[j]);
		var maxY = 0;
		for (var j = i + 1; j < this.listItems.length; j++)
			maxY = maxY + this.getDivHeight(this.listItems[j]);

		var handle = this.listItems[i].getElementsByTagName("span");
		Drag.init(handle[0], this.listItems[i], 0, 0, minY, maxY);
		this.listItems[i].style.zIndex = 0;

		this.listItems[i].onDrag = function(x, y, thisElem)
		{
			x = thisElem.offsetLeft;
			y = thisElem.offsetTop;

			draglist = getDragList(thisElem);

			draglist.recalcOffsets(itemTagName);

			var pos = draglist.getCurrentOffset(thisElem, itemTagName);
			var MoveUp = y + draglist.getDivHeight(thisElem) - (draglist.offsetsY[pos + 1] + draglist.getDivHeight(draglist.listItems[pos + 1]));
			var doMoveUp = MoveUp >= 0;
			var MoveDown = y - draglist.offsetsY[pos - 1];
			var doMoveDown = MoveDown <= 0;

			if ((pos != draglist.listItems.length - 1) && doMoveUp)
			{ 
				draglist.listRoot.removeChild(thisElem);
				
				if (pos + 1 == draglist.listItems.length)
					draglist.listRoot.appendChild(thisElem);
				else
					draglist.listRoot.insertBefore(thisElem, draglist.listItems[pos + 1]);
				
				thisElem.style["top"] = MoveUp + "px";
				thisElem.style["left"] = "0px";
			}
			else if (pos != 0 && doMoveDown) 
			{ 
				draglist.listRoot.removeChild(thisElem);
				draglist.listRoot.insertBefore(thisElem, draglist.listItems[pos - 1]);
				thisElem.style["top"] = MoveDown + "px";
				thisElem.style["left"] = "0px";
			}
		};

		this.listItems[i].onDragEnd = function(x,y,thisElem) 
		{
			thisElem.style["top"] = "0px";
			thisElem.style["left"] = "0px";

			// update min/max X/Y
			draglist = getDragList(thisElem);
			draglist.listItems = draglist.getListItems(itemTagName);
			draglist.recalcDivHeights(itemTagName);
			for (var i = 0; i < draglist.listItems.length; i++) 
			{
				if (draglist.listItems[i] == undefined)
					continue;

				draglist.listItems[i].style.zIndex = 0;
				var minY = 0;
				for (var j = 0; j < i; j++)
					minY = minY - draglist.divheights[j];
				var maxY = 0;
				for (var j = i + 1; j < draglist.listItems.length; j++)
					maxY = maxY + draglist.divheights[j];
	
				var handle = draglist.listItems[i].getElementsByTagName("span");
				handle[0].minX = 0;
				handle[0].minY = minY;
				handle[0].maxX = 0;
				handle[0].maxY = maxY;
			}
		};
	}
	this.recalcOffsets( itemTagName );
}

// "Private" methods.
fv_dragList.prototype.recalcOffsets = function(itemTagName) 
{
	var listItems = this.getListItems(itemTagName);

	for (var i = 0; i < listItems.length; i++) 
		this.offsetsY[i] = listItems[i].offsetTop;
}

fv_dragList.prototype.recalcDivHeights = function(itemTagName) 
{
	var listItems = this.getListItems(itemTagName);

	for (var i = 0; i < listItems.length; i++) 
		this.divheights[i] = this.getDivHeight(listItems[i]);
}

fv_dragList.prototype.getCurrentOffset = function(elem, itemTagName) 
{ 
	var listItems = this.getListItems(itemTagName);

	for (var i = 0; i < listItems.length; i++) 
	{
		if (listItems[i] == elem) 
		{ 
			return i;
			break;
		}
	}
}

fv_dragList.prototype.getDivHeight = function(elem) 
{
	if (elem == undefined)
		return 0;
	
	value = elem.offsetHeight;
	if (isNaN(value))
		value = 0;
	return value;
}

// return list of draggable items
fv_dragList.prototype.getListItems = function(itemTagName)
{
	if (itemTagName == undefined)
		itemTagName = "div";
	var listItems = this.listRoot.getElementsByTagName(itemTagName);
	return(listItems);
}

// add a new dragList to the list of draglists on this page
function addDragList(name)
{
	draglist_manager = new fv_dragList(name);
	draglist_manager.setup();
	dragListIndex[name] = draglist_manager;
}

function refreshDragList(name)
{
	dragListIndex[name].setup();
}

// given a draggable div element, return the draglist it belongs to
function getDragList(elem)
{
	var draglistContainer = elem.parentNode;
	var draglist = dragListIndex[draglistContainer.id];
	return draglist;
}

/**************************************************
 * photos
 *
 **************************************************/

var div;

function closepopup()
{
	if (div)
		div.innerHTML = '';
}

function photo_popup(id, img, top, left)
{
	div = document.getElementById(id);
	div.style["height"] = "0px";
	div.style["width"] = "0px";
	div.style["left"] = "0px";
	div.style["top"] = "0px";

	if (window.innerHeight)
		pos = window.pageYOffset
	else if (document.documentElement && document.documentElement.scrollTop)
		pos = document.documentElement.scrollTop
	else if (document.body)
		pos = document.body.scrollTop

	left = -div.offsetLeft + left;
	top = -div.offsetTop + pos + top;
	div.style["left"] = left + "px";
	div.style["top"] = top + "px";
	div.innerHTML = '<img src="' + img + '" alt="" style="border: 5px solid #000000;" onclick="javascript:closepopup()" />';
}

function photos_deleterow(name, id)
{
	if (confirm('Weet je zeker dat je deze foto wilt verwijderen?'))
	{
		var div = document.getElementById(id);
		div.parentNode.removeChild(div);
		refreshDragList(name);
		return true;
	}
	return false;
}

function photos_order(formName, orderName)
{
	var form = document.getElementsByName(formName);
	var listOrderItems = form[0].getElementsByTagName("input");

	var j = 1;
	for (var i = 0; i < listOrderItems.length; i++)
	{
		var name = listOrderItems[i].name;
		name = name.substring(0, orderName.length);
		if (name == orderName)
		{
  			listOrderItems[i].value = j++;
  		}
	}
}

function photos_setsection(section)
{
    if (section)
    {
        var allSet = true;
        for (var i = 1; i < 8; i++)
        {
            if (!getElementValue(document.forms["photoalbumform"]["s" + i]))
            {
                allSet = false;
            }
        }
        setElementValue(document.forms["photoalbumform"].s0, allSet);
    }
    else
    {
        var set = getElementValue(document.forms["photoalbumform"].s0);
        for (var i = 1; i < 8; i++)
        {
            setElementValue(document.forms["photoalbumform"]["s" + i], set);
        }
    }
}
