var dnd =
	{
		widgetID : null,
		container : null,
		containerID : null,
		newWidgetID : null,
		parentID : null,
		page : null,
		server : document.location.hostname,
		servlet : 'iwmanager',
		length : null,
		json : '',
		responseObject : null,
		setPage : function(page)
			{
				this.page = page;
			},
		init : function()
			{
				if (typeof (dt1) != 'undefined')
					var dt1Obj = dt1.getAllNodes();
				else
					dt1 = new Object();
				if (typeof (dt2) != 'undefined')
					var dt2Obj = dt2.getAllNodes();
				else
					dt2 = new Object();
				if (typeof (dt3) != 'undefined')
					var dt3Obj = dt3.getAllNodes();
				else
					dt3 = new Object();
				if (typeof (dt4) != 'undefined')
					var dt4Obj = dt4.getAllNodes();
				else
					dt4 = new Object();
				if (typeof (dt5) != 'undefined')
					var dt5Obj = dt5.getAllNodes();
				else
					dt5 = new Object();
				if (typeof (footercol1) != 'undefined')
					var footercol1Obj = footercol1.getAllNodes();
				else
					footercol1 = new Object();
				if (typeof (footercol2) != 'undefined')
					var footercol2Obj = footercol2.getAllNodes();
				else
					footercol2 = new Object();
				if (typeof (footercol3) != 'undefined')
					var footercol3Obj = footercol3.getAllNodes();
				else
					footercol3 = new Object();
				if (typeof (sideContent) != 'undefined')
					var sideContentObj = sideContent.getAllNodes();
				else
					sideContent = new Object();
				if (typeof (banner1) != 'undefined')
					var banner1Obj = banner1.getAllNodes();
				else
					banner1 = new Object();
				if (typeof (banner2) != 'undefined')
					var banner2Obj = banner2.getAllNodes();
				else
					banner2 = new Object();
				if (typeof (banner3) != 'undefined')
					var banner3Obj = banner3.getAllNodes();
				else
					banner3 = new Object();

				dojo.subscribe("/dnd/drop", function(source, nodes, iscopy)
					{
						var t = dojo.dnd.manager().target;
						if (t == dt1)
							{
								node = dnd.getLastDroppedId(t, dt1Obj);
								dnd.dropWidget(t, source, nodes, node);
								dt1Obj = dt1.getAllNodes();
							}
						if (t == dt2)
							{
								node = dnd.getLastDroppedId(t, dt2Obj);
								dnd.dropWidget(t, source, nodes, node);
								dt2Obj = dt2.getAllNodes();
							}
						if (t == dt3)
							{
								node = dnd.getLastDroppedId(t, dt3Obj);
								dnd.dropWidget(t, source, nodes, node);
								dt3Obj = dt3.getAllNodes();
							}
						if (t == dt4)
							{
								node = dnd.getLastDroppedId(t, dt4Obj);
								dnd.dropWidget(t, source, nodes, node);
								dt4Obj = dt4.getAllNodes();
							}
						if (t == dt5)
							{
								node = dnd.getLastDroppedId(t, dt5Obj);
								dnd.dropWidget(t, source, nodes, node);
								dt5Obj = dt5.getAllNodes();
							}
						if (t == footercol1)
							{
								node = dnd.getLastDroppedId(t, footercol1Obj);
								dnd.dropWidget(t, source, nodes, node);
								footercol1Obj = footercol1.getAllNodes();
							}
						if (t == footercol2)
							{
								node = dnd.getLastDroppedId(t, footercol2Obj);
								dnd.dropWidget(t, source, nodes, node);
								footercol2Obj = footercol2.getAllNodes();
							}
						if (t == footercol3)
							{
								node = dnd.getLastDroppedId(t, footercol3Obj);
								dnd.dropWidget(t, source, nodes, node);
								footercol3Obj = footercol3.getAllNodes();
							}
						if (t == sideContent)
							{
								node = dnd.getLastDroppedId(t, sideContentObj);
								dnd.dropWidget(t, source, nodes, node);
								sideContentObj = sideContent.getAllNodes();
							}
						if (t == banner1)
							{
								node = dnd.getLastDroppedId(t, banner1Obj);
								dnd.dropWidget(t, source, nodes, node);
								banner1Obj = banner1.getAllNodes();
							}
						if (t == banner2)
							{
								node = dnd.getLastDroppedId(t, banner2Obj);
								dnd.dropWidget(t, source, nodes, node);
								banner2Obj = banner2.getAllNodes();
							}
						if (t == banner3)
							{
								node = dnd.getLastDroppedId(t, banner3Obj);
								dnd.dropWidget(t, source, nodes, node);
								banner3Obj = banner3.getAllNodes();
							}

						if (t == source)
							{
								return;
							}
						else if (t.node.id == 'toolBoxSource')
							{
							}
						else
							{
								// dnd.dropWidget(t, source, nodes);
					}
			}	);

				dojo.subscribe("/dnd/start", function(source, nodes, iscopy)

					{

						if (source.getSelectedNodes()[0].parentNode.id == 'toolBoxSource')
							{
								toolbox.minimize();
							}

					});
				dojo.subscribe("/dnd/source/over", function(source)
					{

						if (source != null && source.getAllNodes().length < 1)
							{

							}
					});
				dojo.subscribe("/dnd/cancel", function()
					{

					});
				dojo.subscribe("/dnd/drop/before", function()
					{

					});
			},
		getLastDroppedId : function(t, co)
			{
				var contains = true;
				var targetNodeList = t.getAllNodes();
				var droppedId = targetNodeList[0];
				for ( var x = 0; x < targetNodeList.length; x++)
					{
						for ( var y = 0; y < co.length; y++)
							{
								if (co[y].id == targetNodeList[x].id)
									{
										contains = true;
										break;
									}
								else
									{
										contains = false;
									}
							}
						if (contains)
							{
								continue;
							}
						else
							{
								droppedId = targetNodeList[x];
								break;
							}
					}
				return droppedId;
			},
		highlightTargets : function()
			{
				var props =
					{
						margin :
							{
								start : '0',
								end : '-5',
								unit : 'px'
							},
						borderWidth :
							{
								start : '0',
								end : '5',
								unit : 'px'
							}
					};
				if (dropTarget == null)
					{
						dropTarget = dojo.dnd.manager().target;
					}
				if (dojo.dnd.manager().target != null)
					{
						dojo.style(dropTarget.node.id, "border", "1px solid grey");
					}
				else
					{
						dojo.style(dropTarget.id, "border", "1px solid grey");
					}
			},
		unhighlightTargets : function(dropTarget)
			{
				var props =
					{
						margin :
							{
								start : '0',
								end : '-5',
								unit : 'px'
							},
						borderWidth :
							{
								start : '0',
								end : '5',
								unit : 'px'
							}
					};
				if (dropTarget == null)
					{
						dropTarget = dojo.dnd.manager().target;
					}
				if (dojo.dnd.manager().target != null)
					{
						dojo.style(dropTarget.node.id, "border", "0px");
					}
				else
					{
						dojo.style(dropTarget.id, "border", "0px");
					}
			},
		dropWidget : function(target, source, nodes, node)
			{
				this.widgetID = nodes[0].id.substring(3, nodes[0].id.length);
				this.containerID = target.node.id;
				this.newWidgetID = dojo.dnd.getUniqueId();
				this.reset(node, target);
			},
		reset : function(node, target)
			{
				var id = node.id;
				var panelID = target.node.id;
				var parent = node.parentNode;
				this.parentID = node.id;
				this.container = target.node;
				this.containerID = this.container.id;
				var targetNodeList = target.getAllNodes();
				// get all widgets in this panel and update the sortorder
		var ids = "{";

		for ( var x = 0; x < targetNodeList.length; x++)
			{
				var widget = targetNodeList[x];
				switch (widget.getAttribute('action'))
					{
						case 'create':
							break;
						case 'move':
							var id = widget.lastChild.id;
							var pos = x;
							var sep = ",";
							ids += "\"" + id + "\":\"" + (targetNodeList.length - 1 == x ? pos + "\"" : pos + "\"" + sep);
					}
			}
		ids += "}";

		this.iWidget.panel = panelID;
		switch (node.getAttribute('action'))
			{
				case 'create':
					this.iWidget.method = 'CREATE';
					node.setAttribute('panel', panelID);
					this.iWidget.sortnumber = '' + this.getPosition();
					node.setAttribute('sortnumber', this.getPosition());
					this.iWidget.page = this.page;
					node.setAttribute('page', this.page);
					this.iWidget.id = this.widgetID;
					this.iWidget.view = 'view';
					this.iWidget.environment = Session.environment;
					node.setAttribute('action', 'move');
					this.iWidget.widget = new Array(eval("(" + ids + ")"));
					this.json = JSON.stringify(this.iWidget, this.replacer);
					toolbox.resetWidget(this.widgetID);
					this.post();
					break;
				case 'move':
					this.iWidget.method = 'UPDATE';
					this.iWidget.environment = Session.environment;
					this.iWidget.widget = new Array(eval("(" + ids + ")"));
					this.json = JSON.stringify(this.iWidget, this.replacer);
					this.moveWidget();
			}
	},
getPosition : function()
	{
		for (i = 0; i < this.container.childNodes.length; i++)
			{
				if (this.container.childNodes[i].id == this.parentID)
					{
						return i;
					}
			}
	},
showWidgetHeader : function(node, show)
	{
		var widgetNode = node.lastChild;
		var box = widgetNode.firstChild;
		var element = box.firstChild;
		var buttons = element.childNodes[1];
		if (this.isHidden(node.parentNode.id))
			{
				if (show)
					{
						if (element.className == 'moveShow')
							{
								element.className = 'move';
								this.hideMenu(buttons);
							}
						else
							{
								element.className = 'moveShow';
								this.showMenu(buttons);
							}
					}
				else
					{
						element.className = 'move';
						this.hideMenu(buttons);
					}
			}
	},
isHidden : function(id)
	{
		switch (id)
			{
				case 'dt1':
					return true;
					break;
				case 'dt2':
					return true;
					break;
				case 'banner1':
					return true;
					break;
				case 'banner2':
					return true;
					break;
				case 'banner3':
					return true;
					break;
				default:
					return false;
			}
	},
showHeader : function(id, show)
	{
		var element = dojo.byId(id + '-dad');
		var buttons = dojo.byId(id + '-buttons');
		if (this.isHidden(element.parentNode.parentNode.parentNode.parentNode.id))
			{
				if (show)
					{
						if (element.className == 'moveShow')
							{
								element.className = 'move';
								this.hideMenu(buttons);
							}
						else
							{
								element.className = 'moveShow';
								this.showMenu(buttons);
							}
					}
				else
					{
						element.className = 'move';
						this.hideMenu(buttons);
					}
			}
	},
showMenu : function(node)
	{
		node.style.opacity = '1';
	},
hideMenu : function(node)
	{
		node.style.opacity = '0';
	},
getInfo : function(id)
	{
		alert('Info:' + id);
	},
blind : function(node)
	{
		var id = node.parentNode.id.replace(/-buttons/g, "-body");
		var body = dojo.byId(id);
		if (node.className == 'minimize')
			{
				body.setAttribute('class', 'box-cnt-hidden');
				node.className = 'expand';
				node.setAttribute('title', 'Expandera');

			}
		else if (node.className == 'expand')
			{
				body.setAttribute('class', 'box-cnt');
				node.className = 'minimize';
				node.setAttribute('title', 'Minimera widgeten');
			}
	},
editWidget : function(node)
	{
		alert('Edit:' + node.parentNode.id);
	},

deleteWidget : function(node)
	{
		if (confirm("Do you want to remove this widget?"))
			{
				this.iWidget.method = 'DELETE';
				this.iWidget.id = node.id;
				this.iWidget.environment = Session.environment;
				this.json = JSON.stringify(this.iWidget, this.replacer);

				dojo.xhrGet(
					{
						url : "http://" + this.server + "/servlet/" + this.servlet,
						handleAs : "text",
						timeout : 1500,
						content :
							{
								json : this.json
							},

						load : function(response, ioArgs)
							{ // (4)
							var widget = node;
							var parentWidget = widget.parentNode;
							parentWidget.removeChild(widget);
							var parentparentWidget = parentWidget.parentNode;
							parentparentWidget.removeChild(parentWidget);
							return response; // (6)

					},

				// The ERROR function will be called in an error case.
						error : function(response, ioArgs)
							{
								// console.error("HTTP status code: ",response);
						alert(response + ' from error function');
						return response;
					}
					});
			}
		;

	},
moveWidget : function()
	{

		dojo.xhrGet(
			{
				url : "http://" + this.server + "/servlet/" + this.servlet,
				handleAs : "text",
				timeout : 1500,
				content :
					{
						json : this.json
					},

				load : function(response, ioArgs)
					{

						return response;

					},

				// The ERROR function will be called in an error case.
				error : function(response, ioArgs)
					{
						// console.error("HTTP status code: ", response);
				alert(response + ' from error function');
				return response;
			}
			});
	},

"iWidget" :
	{
		"method" : "",
		"panel" : "",
		"page" : "",
		"sortnumber" : "",
		"id" : "",
		"view" : "",
		"environment" : ""
	},
post : function()
	{
		dojo.xhrGet(
			{
				url : "http://" + this.server + "/servlet/" + this.servlet,
				handleAs : "json",
				content :
					{
						json : this.json
					},
				handle : this.handler
			});
	},
handler : function(response, ioArgs)
	{
		var error = response instanceof Error;
		var responseText = error ? response.message : ioArgs.xhr.responseText;
		dnd.responseObject = eval("(" + responseText + ")");
		if (dnd.responseObject.id != null)
			{
				var widgetContainer = dojo.byId(dnd.parentID);

				var widgetWrapper = widgetContainer.lastChild;
				widgetWrapper.setAttribute('id', dnd.responseObject.id);
				var box = widgetWrapper.firstChild;
				var dad = box.firstChild;
				dad.setAttribute('id', dnd.responseObject.id + '-dad');
				var dadChildren = dad.childNodes;
				var icon = dadChildren[0];
				icon.setAttribute('id', dnd.responseObject.id + '-icon');
				var buttons = dadChildren[1];
				buttons.setAttribute('id', dnd.responseObject.id + '-buttons');
				var text = dadChildren[2];
				text.setAttribute('id', dnd.responseObject.id + '-text');
				var body = box.lastChild;
				body.setAttribute('id', dnd.responseObject.id + '-body');
				var iwidget = body.firstChild;
				iwidget.setAttribute('id', 'iw-body-' + dnd.responseObject.id);
				var href = iwidget.firstChild;
				href.setAttribute('href', 'iwidget.xml?open&id=' + dnd.responseObject.id);
			}
	},
replacer : function(key, value)
	{
		return value;
	}
	}