if ("undefined" == typeof(RadDockNamespace))
{
	RadDockNamespace = new Object();
}

/*************************************************
 *
 * RadDockingManager
 *
 *************************************************/
RadDockNamespace.RadDockingManager = function(dockEnabled
    , arrDockingZones
    , arrDockableObjects
    , dragHelperID
    , dragHelperTooltipID
    , showContentWhileDragging
    , useEffects
    , effectsUpdateSpeed
    , effectsDuration
    , showToolTipWhileDragging
    , dockingZonesCount
)
{
    //PETIO:The following lines are for disposing to invoke Dispose when an AJAX is created
    if (typeof(RadControlsNamespace.__dockingmanager__) == "undefined")
	{
		RadControlsNamespace.__dockingmanager__ = [];
	}	
	// dispose the "old" dockingmanager after callback
	if (RadControlsNamespace.__dockingmanager__[this.ID] )
	{
		RadControlsNamespace.__dockingmanager__[this.ID].Dispose();
	}
	// set/update the reference to the current dock
	RadControlsNamespace.__dockingmanager__[this.ID] = this;
    ///////////END:PETIO
	this.Document = document;
	this.ShowContentWhileDragging = showContentWhileDragging;
	this.ShowToolTipWhileDragging = showToolTipWhileDragging;
	
	this.DockingZones = new Array();
	this.DockableObjects = new Array();
	
	this.zoneIndexTable = [];
	this.objectIndexTable = [];
	
	this.UseEffects = useEffects;
	this.EffectsUpdateSpeed = effectsUpdateSpeed;
	this.EffectsDuration = effectsDuration;
	this.DockingZonesCount = dockingZonesCount;
	
	this.RegisterDockingZones(arrDockingZones);
	
	// objects needs initialized zones
	this.RegisterDockableObjects(arrDockableObjects);	
	
	// saving zone's state needs initialized objects
	
	this.SaveDockingZonesState();
			
	this.InitDragHelper(dragHelperID, dragHelperTooltipID);
		
	this.EnableDocking(dockEnabled);
	
	var dockingManager = this;
	//Petio: should be visible to detach it on Dispose
	this.unloadHandlerFunc = function()
	{
		if (dockingManager)
		{		    
			dockingManager.Dispose();
		}
	};
	
	RadDockNamespace.AttachEvent(window, "unload", this.unloadHandlerFunc);
}

RadDockNamespace.RadDockingManager.prototype.InitDragHelper = function(dragHelperID, dragHelperTooltipID)
{
	var dragHelper = document.getElementById(dragHelperID);	
	if (dragHelper)
	{
		RadDockNamespace.InitMoveableObject(dragHelper);

		if (document.all)
		{
			dragHelper.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=25)";
		}
		else
		{
			dragHelper.style.setProperty("-moz-opacity", "0.25", "");
		}
	}
	
	this.DragHelper = dragHelper;
	
	var dragHelperTooltip = document.getElementById(dragHelperTooltipID);	
	if (dragHelperTooltip)
	{
		RadDockNamespace.RadTooltip_Init(dragHelperTooltip);
	}
	
	this.DragHelperTooltip = dragHelperTooltip;
};

/*************************************************
 *
 * RegisterDockingZones
 *
 *************************************************/
RadDockNamespace.RadDockingManager.prototype.RegisterDockingZones = function(arrDockingZones)
{
	for (var i = 0; i < arrDockingZones.length; i++)
	{
		this.RegisterDockingZone(arrDockingZones[i]);
	}
};

RadDockNamespace.RadDockingManager.prototype.SaveDockingZonesState = function() 
{
	for (var i = 0; i < this.DockingZones.length; i++)
	{
		this.DockingZones[i].SaveState();
	}		
}

/*************************************************
 *
 * RegisterDockableObjects
 *
 *************************************************/
RadDockNamespace.RadDockingManager.prototype.RegisterDockableObjects = function(arrDockableObjects)
{
	for (var i = 0; i < arrDockableObjects.length; i++)
	{
		this.RegisterDockableObject(arrDockableObjects[i]);
	}
};

/*************************************************
 *
 * RegisterDockingZone
 *
 *************************************************/
RadDockNamespace.RadDockingManager.prototype.RegisterDockingZone = function(dockingZoneInfo)
{
	if (!dockingZoneInfo || !dockingZoneInfo.length)
		return;

	var id = dockingZoneInfo[0];
	var dockingZone = this.Document.getElementById(id);	
	if (!dockingZone)
		return;
	
	RadDockNamespace.RadDockingZone_Init(dockingZone, dockingZoneInfo.slice(1));
	
	dockingZone.Manager = this;
	
	// shitty callback tricks
	var index = this.zoneIndexTable[dockingZone.id];
	if (null == index)
	{
		index = this.DockingZones.length;
	}	
	this.DockingZones[index] = dockingZone;
	this.zoneIndexTable[dockingZone.id] = index;
};

/*************************************************
 *
 * RegisterDockableStaticObject
 *
 *************************************************/
RadDockNamespace.RadDockingManager.prototype.RegisterDockableStaticObject = function(dockableStaticObjectInfo)
{
    if (!dockableStaticObjectInfo || !dockableStaticObjectInfo.length)
		return;
		
	var id = dockableStaticObjectInfo[0];
	var dockableObject = this.Document.getElementById(id);
	if (!dockableObject)
		return;
		
	//RadDockNamespace.InitDockableObject(dockableObject, dockableObjectInfo.slice(1));
	RadDockNamespace.InitMoveableObject(dockableObject);
	Object.Extend(dockableObject, RadDockNamespace.RadDockableObject);
	dockableObject.Commands = new Array();
	dockableObject.Manager = this;
	dockableObject.IsStaticObject = true;
	
	// shitty callback tricks
	var index = this.objectIndexTable[dockableObject.id];
	if (null == index)
	{
		index = this.DockableObjects.length;
	}	
	this.DockableObjects[index] = dockableObject;
	this.objectIndexTable[dockableObject.id] = index;

	this.SaveDockingZonesState();
};

/*************************************************
 *
 * RegisterDockableObject
 *
 *************************************************/
RadDockNamespace.RadDockingManager.prototype.RegisterDockableObject = function(dockableObjectInfo)
{
	if (!dockableObjectInfo || !dockableObjectInfo.length)
		return;
		
	var id = dockableObjectInfo[0];
	var dockableObject = this.Document.getElementById(id);
	if (!dockableObject)
		return;
		
	RadDockNamespace.InitDockableObject(dockableObject, dockableObjectInfo.slice(1));
	
	dockableObject.Manager = this;
	
	// shitty callback tricks
	var index = this.objectIndexTable[dockableObject.id];
	if (null == index)
	{
		index = this.DockableObjects.length;
	}	
	this.DockableObjects[index] = dockableObject;
	this.objectIndexTable[dockableObject.id] = index;

	this.SaveDockingZonesState();
	
	//dockableObject.onmousedown = function() { this.BringToFront(); };
};

/*************************************************
 *
 * EnableDocking
 *
 *************************************************/
RadDockNamespace.RadDockingManager.prototype.EnableDocking = function(dockEnabled)
{
	this.DockEnabled = dockEnabled;
	
	if (this.DockEnabled)
	{
		RadDockNamespace.AttachEvent(this.Document, "mousemove", RadDockNamespace.RadDock_MouseMove);
		RadDockNamespace.AttachEvent(this.Document, "mousedown", RadDockNamespace.RadDock_MouseDown);
		RadDockNamespace.AttachEvent(this.Document, "mouseup", RadDockNamespace.RadDock_MouseUp);
		RadDockNamespace.AttachEvent(this.Document, "keydown", RadDockNamespace.RadDock_KeyDown);
	}
	else
	{
		RadDockNamespace.DetachEvent(this.Document, "mousemove", RadDockNamespace.RadDock_MouseMove);
		RadDockNamespace.DetachEvent(this.Document, "mousedown", RadDockNamespace.RadDock_MouseDown);
		RadDockNamespace.DetachEvent(this.Document, "mouseup", RadDockNamespace.RadDock_MouseUp);
		RadDockNamespace.DetachEvent(this.Document, "keydown", RadDockNamespace.RadDock_KeyDown);
	}
};

/*************************************************
 *
 * DockingZoneHitTest -- Gets the first docking zone
 * hoverd by a given dockable object. If no zone is hoverd returns null.
 * Hovered zone is highlighted.
 *
 *************************************************/
RadDockNamespace.RadDockingManager.prototype.DockingZoneHitTest = function(dockableObject
	, eventArgs
	, dockableObjectRect)
{
	var dockingZone;
	var hitZone;
	
	/*
	for (var i = 0; i < this.DockingZones.length; i++)
	{
		dockingZone = this.DockingZones[i];
		
		if (!hitZone)
		{
			if (dockingZone.HitTest(dockableObject, eventArgs, dockableObjectRect))
			{
				hitZone = dockingZone;
				// Higlight hit zone
				hitZone.Highlight();
			}
		}		
		
		if (dockingZone != hitZone)
		{
			// For all zones other than the hover(hit) zone highlighting is removing
			dockingZone.Highlight(false);
		}
	}
	*/
	
	for (var i = 0; i < this.DockingZones.length; i++)
	{
		dockingZone = this.DockingZones[i];
		if (dockingZone.HitTest(dockableObject, eventArgs, dockableObjectRect))
		{
			// TODO: for each hit zone calculate the level of the zone.
			// If it is greater than the level of the current zone - this is the hit zone.
			// If it is the same as the current hit zone - compare their zIndexes
			
			hitZone = dockingZone;
		}
	}
	
	for (var i = 0; i < this.DockingZones.length; i++)
	{
		dockingZone = this.DockingZones[i];
		dockingZone.Highlight(dockingZone == hitZone);
	}	
	
	return hitZone;
};

RadDockNamespace.RadDockingManager.prototype.Dispose = function()
{
	for (var i = 0; i < this.DockableObjects.length; i++)
	{
		this.DockableObjects[i].Dispose();
		this.DockableObjects[i] = null;
	}
	
	for (var i = 0; i < this.DockingZones.length; i++)
	{
		this.DockingZones[i].Dispose();
		this.DockingZones[i] = null;
	}
	
	this.DockableObjects = null;
	this.DockingZones = null;
	this.Document = null;
	this.DragHelper = null;
	
	RadDock_ActiveObject = null;
	RadDock_ActiveDockingZone = null;
	RadDock_DragHelper = null;
	RadDock_HoverDockableObject = null;
	//PETIO : This fixes the problem when the dispose is invoked 2 times.when the ajax is maded
	RadDockNamespace.DetachEvent(window, "unload", this.unloadHandlerFunc);
	this.unloadHandlerFunc = null;
};

RadDockNamespace.RadDockingManager.prototype.SaveState = function()
{
	var o;
	for (var i = 0; i < this.DockableObjects.length; i++)
	{
		o = this.DockableObjects[i];
		if (o && o.SaveState)
		{
			o.SaveState();
		}
	}
	
	for (var i = 0; i < this.DockingZones.length; i++)
	{
		o = this.DockingZones[i];
		if (o && o.SaveState)
		{
			o.SaveState();
		}
	}
};

//BEGIN_ATLAS_NOTIFY
if (typeof(Sys) != "undefined")
{
    if (Sys.Application != null && Sys.Application.notifyScriptLoaded != null)
    {
        Sys.Application.notifyScriptLoaded();
    }
}
//END_ATLAS_NOTIFY
