//
//  This script was created
//  by Mircho Mirev
//  mo /mo@momche.net/
//	Copyright (c) 2004 Mircho Mirev
//
//	:: feel free to use it BUT
//	:: if you want to use this code PLEASE send me a note
//	:: and please keep this disclaimer intact
//

function cElementResizer( sElementId )
{
	this.init( sElementId )
	this.bInBounds = false
	this.bDraging = false
}

cElementResizer.CS_NAME = 'Resize element component'
cElementResizer.CS_OBJ_NAME = 'ERSZ_COMPONENT'
/* margins */
cElementResizer.CN_MARGIN = 10
cElementResizer.CN_MIN_WIDTH = 120
cElementResizer.CN_MIN_HEIGHT = 50
cElementResizer.CN_START_ZINDEX = 1000

cElementResizer.CB_AUTOINIT = true
cElementResizer.nCount = 0
cElementResizer.nZIndex = cElementResizer.CN_START_ZINDEX

cElementResizer.autoInit = function()
{
	var nI = 0
	var hERSZ = null
	var sResizeAtt

	var aDivs = document.getElementsByTagName( 'DIV' )
	for( nI = 0; nI < aDivs.length; nI++ )
	{
	 	sResizeAtt = aDivs[ nI ].getAttribute( 'resizable' )
		if( sResizeAtt != null && sResizeAtt.length > 0 )
		{
			if( aDivs[ nI ].id == '' )
			{
				aDivs[ nI ].id = cElementResizer.CS_OBJ_NAME + cElementResizer.nCount++
			}
			hERSZ = new cElementResizer( aDivs[ nI ].id )
		}
	}
}

if( cElementResizer.CB_AUTOINIT )
{
	if( window.attachEvent ) 
	{
		window.attachEvent( 'onload', cElementResizer.autoInit )
	}
	else if( window.addEventListener )
	{
		window.addEventListener( 'load', cElementResizer.autoInit, false )
	}
	document.dragTarget = null
}

cElementResizer.prototype.init = function( sElementId )
{
	this.sElementId = sElementId
	var hElement = document.getElementById( this.sElementId )

	if( hElement.attachEvent ) 
	{
		document.attachEvent( 'onmousemove', cElementResizer.onDocumentMove )
		hElement.attachEvent( 'onmousemove', cElementResizer.onMove )
		hElement.attachEvent( 'onmouseout', cElementResizer.onOut )
		hElement.attachEvent( 'onmousedown', cElementResizer.onDown )
		hElement.attachEvent( 'onmouseup', cElementResizer.onUp )
	}
	else if( hElement.addEventListener )
	{
		document.addEventListener( 'mousemove', cElementResizer.onDocumentMove, false )
		hElement.addEventListener( 'mousemove', cElementResizer.onMove, false )
		hElement.addEventListener( 'mouseout', cElementResizer.onOut, false )
		hElement.addEventListener( 'mousedown', cElementResizer.onDown, false )
		hElement.addEventListener( 'mouseup', cElementResizer.onUp, false )
	}
	
	var sOnResize = hElement.getAttribute( 'onresize' )
	if( sOnResize != null && sOnResize.length > 0 )
	{
		this.onResize = new Function( sOnResize )
	}

	var sOnMove = hElement.getAttribute( 'onmove' )
	if( sOnMove != null && sOnMove.length > 0 )
	{
		this.onMove = new Function( sOnMove )
	}
	
	hElement.resizer = this
	//this.restorePosition()
}

cElementResizer.prototype.encodeCookieData = function()
{
	var hElement = document.getElementById( this.sElementId )
	var sData = ''
	sData += 'left='+hElement.style.left+';'
	sData += 'top='+hElement.style.top+';'
	if( hElement.currentStyle )
	{
		sData += 'width='+parseInt( hElement.currentStyle.width )+';'
		sData += 'height='+parseInt( hElement.currentStyle.height )+';'
	}
	else
	{
		sData += 'width='+hElement.offsetWidth+';'
		sData += 'height='+hElement.offsetHeight+';'
	}
	sData += 'zindex='+hElement.style.zIndex+';'
	return sData
}

cElementResizer.prototype.decodeCookieData = function( sData )
{
	var hElement = document.getElementById( this.sElementId )
	var reLeft = /left=([^;]*)/i
	var reTop = /top=([^;]*)/i
	var reWidth = /width=([^;]*)/i
	var reHeight = /height=([^;]*)/i
	var reZIndex = /zindex=([^;]*)/i
	if( reLeft.exec( sData ) )
	{
		hElement.style.left = RegExp.$1
	}
	if( reTop.exec( sData ) )
	{
		hElement.style.top = RegExp.$1
	}
	if( reWidth.exec( sData ) )
	{
		hElement.style.width = RegExp.$1
	}
	if( reHeight.exec( sData ) )
	{
		hElement.style.height = RegExp.$1
	}
	if( reZIndex.exec( sData ) )
	{
		hElement.style.zIndex = RegExp.$1
	}
}

cElementResizer.prototype.preservePosition = function()
{
	if( typeof CookieManager != 'undefined' )
	{
		CookieManager.setCookie( 'mo_resizer_' + this.sElementId, this.encodeCookieData() )
	} 
}

cElementResizer.prototype.restorePosition = function()
{
	if( typeof CookieManager != 'undefined' )
	{
		var sPositionData = CookieManager.getCookie( 'mo_resizer_' + this.sElementId )
		if( sPositionData && sPositionData.length > 0 )
		{
			this.decodeCookieData( sPositionData )
		}
	} 
}

cElementResizer.prototype.clearPosition = function()
{
	if( typeof CookieManager != 'undefined' )
	{
		CookieManager.setCookie( 'mo_resizer_' + this.sElementId, '' )
	} 
}


cElementResizer.prototype.startDrag = function( nPosX, nPosY, nScreenX, nScreenY )
{
	var hElement = document.getElementById( this.sElementId )
	if( !this.bDraging && !document.dragTarget )
	{
		document.dragTarget = hElement
		this.bDraging = true
		this.bStartDraging = true
		this.checkBounds( nPosX, nPosY )
		this.updatePos( nScreenX, nScreenY )
		this.setCursor()
		this.setZIndexUp()
		this.onStartDrag()
	}
}

cElementResizer.prototype.stopDrag = function()
{
	if( this.bDraging )
	{
		document.dragTarget = null
		this.bDraging = false
		this.bStartDraging = false
		this.updatePos( 0, 0 )
		this.preservePosition()
		this.onStopDrag()
	}
}

cElementResizer.prototype.setInBounds = function( bInBounds )
{
	this.bInBounds = bInBounds
}


cElementResizer.prototype.setZIndexUp = function()
{
	var hElement = document.getElementById( this.sElementId )
	hElement.style.zIndex = cElementResizer.nZIndex++
}


cElementResizer.prototype.checkBounds = function( nX, nY )
{
	var hElement = document.getElementById( this.sElementId )

	var sXResize = ''
	var sYResize = ''
	if( nX < cElementResizer.CN_MARGIN )
	{
		//sXResize = 'w'
	}
	else if( ( hElement.offsetWidth - nX ) < cElementResizer.CN_MARGIN + 5 )
	{
		sXResize = 'e'
	}

	if( nY < cElementResizer.CN_MARGIN )
	{
		//sYResize = 'n'
	}
	else if( ( hElement.offsetHeight - nY ) < cElementResizer.CN_MARGIN + 5 )
	{
		sYResize = 's'
	}
	
	//for now I need only resizing when it's in the south east corner
	if( sXResize == '' || sYResize == '' )
	{
		sXResize = ''
		sYResize = ''
	}
	
	this.sXResize = sXResize
	this.sYResize = sYResize
	
	if( this.sXResize != '' || this.sYResize != '' )
	{
		return true
	}
	else
	{
		return false
	}
}

cElementResizer.prototype.setCursor = function( hEvent )
{
	var hElement = document.getElementById( this.sElementId )
	if( this.bInBounds )
	{
		//if( this.sXResize != '' || this.sYResize != '' )
		if( this.sXResize == 'e' && this.sYResize == 's' )
		{
			hElement.style.cursor = this.sYResize + this.sXResize + '-resize'
		}
		else
		{
			hElement.style.cursor = 'move'
			document.body.style.cursor =  'auto'
		}
	}
	else
	{
		hElement.style.cursor = 'auto'
		document.body.style.cursor =  'auto'
	}
}

cElementResizer.prototype.updatePos = function( nNewX, nNewY )
{
	this.nScreenX = parseInt( nNewX )
	this.nScreenY = parseInt( nNewY )
}

cElementResizer.prototype.moveElement = function( nScreenX, nScreenY )
{
	var hElement = document.getElementById( this.sElementId )
	if( this.sXResize == '' && this.sYResize == '' )
	{
		hElement.style.left = parseInt( hElement.offsetLeft ) + ( parseInt( nScreenX ) - this.nScreenX ) + 'px'
		hElement.style.top = parseInt( hElement.offsetTop ) + ( parseInt( nScreenY ) - this.nScreenY ) + 'px'
		this.updatePos( nScreenX, nScreenY )
		this.onMove()
	}
	else
	{
		if( this.sXResize == 'e' && this.sYResize == 's' )
		{
			var nNewWidth = parseInt( hElement.offsetWidth )
			var nNewHeight =  parseInt( hElement.offsetHeight )
			if( hElement.currentStyle )
			{
				nNewWidth = parseInt( hElement.currentStyle.width )
				nNewHeight =  parseInt( hElement.currentStyle.height )
			}
			nNewWidth += parseInt( nScreenX ) - this.nScreenX
			nNewHeight += parseInt( nScreenY ) - this.nScreenY
			var nNewSX = this.nScreenX
			var nNewSY = this.nScreenY
			if( nNewWidth > cElementResizer.CN_MIN_WIDTH )
			{
				hElement.style.width = nNewWidth + 'px'
				nNewSX = nScreenX
			}
			if( nNewHeight > cElementResizer.CN_MIN_HEIGHT )
			{
				hElement.style.height = nNewHeight + 'px'
				nNewSY = nScreenY
			}
			this.updatePos( nNewSX, nNewSY )
		}
		this.onResize()
	}
}

cElementResizer.getResizerParent = function( hElement )
{
	var hResizerEl = getParentByProperty( hElement, 'resizer', null )
	var hResizer = null
	if( hResizerEl != null )
	{
		hResizer = hResizerEl.resizer
	}
	return hResizer
}

cElementResizer.onMove = function( hEvent )
{
	cDomEvent.init( hEvent )
	var hResizer = cElementResizer.getResizerParent( cDomEvent.target )
	if( hResizer )
	{
		if( !hResizer.bDraging )
		{
			if( cDomEvent.target.resizer || cDomEvent.target.className == 'draghandle' || cDomEvent.target.className == 'resize' )
			{
				hResizer.setInBounds( true )
			}
			else
			{
				hResizer.setInBounds( false )
			}
			var nX = cDomEvent.x + getObject.getSize( 'offsetLeft', cDomEvent.target, document.getElementById( hResizer.sElementId ) )
			var nY = cDomEvent.y + getObject.getSize( 'offsetTop', cDomEvent.target, document.getElementById( hResizer.sElementId ) )
			hResizer.checkBounds( nX, nY )
			hResizer.setCursor()
		}
	}
}

cElementResizer.onDocumentMove = function( hEvent )
{
	if( document.dragTarget != null )
	{
		cDomEvent.init( hEvent )
		if( document.dragTarget.resizer.bDraging )
		{
			document.dragTarget.resizer.moveElement( cDomEvent.screenX, cDomEvent.screenY )
		}
	}
}

cElementResizer.onOut = function( hEvent )
{
	cDomEvent.init( hEvent )
	var hResizer = cElementResizer.getResizerParent( cDomEvent.target )
	if( hResizer && !hResizer.bDraging )
	{
		hResizer.setInBounds( false )
		hResizer.checkBounds( cDomEvent.x, cDomEvent.y )
		hResizer.setCursor()
	}
}

cElementResizer.onDown = function( hEvent )
{
	cDomEvent.init( hEvent )
	var hResizer = cElementResizer.getResizerParent( cDomEvent.target )
	if( document.dragTarget == null && ( cDomEvent.target.resizer || cDomEvent.target.className == 'draghandle' || cDomEvent.target.className == 'resize' ) )
	{
		var nX = cDomEvent.x + getObject.getSize( 'offsetLeft', cDomEvent.target, document.getElementById( hResizer.sElementId ) )
		var nY = cDomEvent.y + getObject.getSize( 'offsetTop', cDomEvent.target, document.getElementById( hResizer.sElementId ) )
		hResizer.startDrag( nX, nY, cDomEvent.screenX, cDomEvent.screenY )
	}
}

cElementResizer.onUp = function( hEvent )
{
	cDomEvent.init( hEvent )
	var hResizer = cElementResizer.getResizerParent( cDomEvent.target )
	if( hResizer )
	{
		hResizer.stopDrag()
	}
}


//event handlers
cElementResizer.prototype.onStartDrag = function() {}
cElementResizer.prototype.onStopDrag = function() {}
cElementResizer.prototype.onMove = function() {}
cElementResizer.prototype.onResize = function() {}