
	var boolDragInitilized = false;
	
	var intDragBorder = 12;
	
	var intCurrDrag = -1;
	var aryDragElements = null;
	
	var intSelectedDrag = -1;
	var intStartMouseX = 0;
	var intStartMouseY = 0;
	
	var aryDragListeners = new Array(10);
	var aryDragListenersCount = -1;
	
	var aryDragInfo = new Array();
	var aryDragDir = new Array();

	function dragElementStart(vntInfo, intDir) //intDir: 0 = both, 1 = horizontal, 2 = vertical
	{
		var strCursor = 'move';
		
		intCurrDrag++;
		
		if( intDir == 1 ) 
			strCursor = 'e-resize';
		else if( intDir == 2 ) 
			strCursor = 's-resize';
			
		//aryDragInfo.push( vntInfo );
		aryDragInfo = pushArray(aryDragInfo, vntInfo);
		if( intDir )
			aryDragDir = pushArray(aryDragDir, intDir);
		else
			aryDragDir = pushArray(aryDragDir, 0);
		
		document.write( '<table id="dragTable' + intCurrDrag + '" border="0" cellpadding="0" cellspacing="0" style="width: 100%; height: 100%;" onMouseUp="endDrag(' + intCurrDrag + ')">' );
		document.write( '	<tr>' );
		document.write( '		<td id="dragContainer' + intCurrDrag + '">&nbsp;' );
		document.write( '			<div id="dragElement' + intCurrDrag + '" style="z-index: 99; position: absolute; margin: 0px; padding: 0px; cursor: ' + strCursor + ';" onMouseDown="startDrag(' + intCurrDrag + '); return false;" onMouseUp="endDrag(' + intCurrDrag + ')" onClick="return false;" onMouseMove="return false;">' );
		
	}
	
	function dragElementEnd()
	{
		document.write( '			</div>' );
		document.write( '		</td>' );
		document.write( '</table>' );	
	}
	
	function addDragListener(strListeningFunction)
	{
		aryDragListenersCount++;
		aryDragListeners[aryDragListenersCount] = strListeningFunction;
	}
	
	function startDrag(intDragNum)
	{
		intSelectedDrag = intDragNum;
		
		intStartMouseX = intCurrMouseX;
		intStartMouseY = intCurrMouseY;
	}
	
	function endDrag(intDragNum)
	{
		intSelectedDrag = -1;
	}	
	
	function dragMouseListener(intMouseX, intMouseY)
	{
		var boolEndDrag = false;
		
		if( intSelectedDrag == -1 )
			return;
			
		var intX = aryDragElements[intSelectedDrag][3] + intCurrMouseX - intStartMouseX;
		var intY = aryDragElements[intSelectedDrag][4] + intCurrMouseY - intStartMouseY;
				
		if( intX < aryDragElements[intSelectedDrag][2].left )
		{
			intX = aryDragElements[intSelectedDrag][2].left;
			if( intCurrMouseX < (aryDragElements[intSelectedDrag][0].offsetLeft - intDragBorder) )
				boolEndDrag = true;
		}
		else if( intX > aryDragElements[intSelectedDrag][5] )
		{
			intX = aryDragElements[intSelectedDrag][5];
			if( intCurrMouseX > (aryDragElements[intSelectedDrag][0].offsetLeft + aryDragElements[intSelectedDrag][0].offsetWidth + intDragBorder) )
				boolEndDrag = true;
		}
			
		if( intY < aryDragElements[intSelectedDrag][2].top )
		{
			intY = aryDragElements[intSelectedDrag][2].top;
			if( intCurrMouseY < (aryDragElements[intSelectedDrag][0].offsetTop - intDragBorder) )
				boolEndDrag = true;
		}
		else if( intY > aryDragElements[intSelectedDrag][6] )
		{
			intY = aryDragElements[intSelectedDrag][6];
			if( intCurrMouseY > (aryDragElements[intSelectedDrag][0].offsetTop + aryDragElements[intSelectedDrag][0].offsetHeight + intDragBorder) )			
				boolEndDrag = true;
		}
		
		if( aryDragDir[intSelectedDrag] == 1 )
			intY = aryDragElements[intSelectedDrag][4];
			
		if( aryDragDir[intSelectedDrag] == 2 )
			intX = aryDragElements[intSelectedDrag][3]; 		
		
		aryDragElements[intSelectedDrag][3] = intX;
		aryDragElements[intSelectedDrag][4] = intY;
		
		aryDragElements[intSelectedDrag][0].style.left = intX;
		aryDragElements[intSelectedDrag][0].style.top = intY;
		
		var intPercentX = (intX-aryDragElements[intSelectedDrag][2].left);
		if( (aryDragElements[intSelectedDrag][5]-aryDragElements[intSelectedDrag][2].left) > 0 )
			intPercentX = intPercentX / (aryDragElements[intSelectedDrag][5]-aryDragElements[intSelectedDrag][2].left);
		else
			intPercentX = 0;
		var intPercentY = (intY-aryDragElements[intSelectedDrag][2].top);
		if( (aryDragElements[intSelectedDrag][6]-aryDragElements[intSelectedDrag][2].top) > 0 )
			intPercentY = intPercentY / (aryDragElements[intSelectedDrag][6]-aryDragElements[intSelectedDrag][2].top);
		else
			intPercentY = 0;
		
		for( i = 0; i <= aryDragListenersCount; i++ )
			eval( aryDragListeners[aryDragListenersCount] + '(' + intSelectedDrag + ',' + intPercentX + ',' + intPercentY  + ');' );
			
		intStartMouseX = intCurrMouseX;
		intStartMouseY = intCurrMouseY;
		
		if( boolEndDrag )
			endDrag(intSelectedDrag);			
	}
	
	function initDrag()
	{
		if( boolDragInitilized )
			return;
			
		var objCurrDrag = null;
		var objParent = null;
		var objCurrParentPos = null;
		var objDragTable = null;
		
		aryDragElements = new Array(intCurrDrag+1);
		
		for( i=0 ; i <= intCurrDrag ; i++ )
		{
			objCurrDrag = getObject( 'dragElement' + i );
			objParent = getObject( 'dragContainer' + i );
			objCurrParentPos = getAbsolutePosition( objParent );
			objDragTable = getObject( 'dragTable' + i );
						
			aryDragElements[i] = new Array(7);
			aryDragElements[i][0] = objCurrDrag;
			aryDragElements[i][1] = objParent;
			aryDragElements[i][2] = objCurrParentPos;
			aryDragElements[i][3] = objCurrParentPos.left; //OffsetX
			aryDragElements[i][4] = objCurrParentPos.top; //OffsetY
			aryDragElements[i][5] = objCurrParentPos.left + objCurrParentPos.width - objCurrDrag.offsetWidth; //max OffsetX
			aryDragElements[i][6] = objCurrParentPos.top + objCurrParentPos.height - objCurrDrag.offsetHeight; //max OffsetY;

			objCurrDrag.style.top = objCurrParentPos.top;
			objCurrDrag.style.left = objCurrParentPos.left;
		}
				
		addMouseListener('dragMouseListener');
		boolMouseMoveReturnValue = false;
		initMouse();
		
		boolDragInitilized = true;
	}	
