//
//  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 )
        }
        sDragAtt = aDivs[ nI ].getAttribute( 'dragable' )
        if( sDragAtt != null && sDragAtt.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 )
	cElementResizer.nZIndex = hElement.style.zIndex ? parseInt( hElement.style.zIndex ) : cElementResizer.nZIndex
    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 )
    }

    this.bResizable = hElement.getAttribute( 'resizable' ) == 'true'
    this.bDragable = hElement.getAttribute( 'dragable' ) == 'true'

    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 )

	if( !hElement ) return false

    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( !hElement ) return false

    if( this.bInBounds )
    {
        //if( this.sXResize != '' || this.sYResize != '' )
        if( this.sXResize == 'e' && this.sYResize == 's' && this.bResizable )
        {
            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.bResizable || ( 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.bResizable )
    {
        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.toString().indexOf( 'draghandle' ) >= 0 || cDomEvent.target.className == 'resize' )
            {
                hResizer.setInBounds( true )
            }
            else
            {
                hResizer.setInBounds( false )
            }
            var nX = cDomEvent.x + cDomObject.getOffsetParam( cDomEvent.target, 'offsetLeft', document.getElementById( hResizer.sElementId ) )
            var nY = cDomEvent.y + cDomObject.getOffsetParam( cDomEvent.target, 'offsetTop', 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.toString().indexOf( 'draghandle' ) >= 0 || cDomEvent.target.className == 'resize' ) )
    {
        var nX = cDomEvent.x + cDomObject.getOffsetParam( cDomEvent.target, 'offsetLeft', document.getElementById( hResizer.sElementId ) )
        var nY = cDomEvent.y + cDomObject.getOffsetParam( cDomEvent.target, 'offsetTop', 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()
    }
    if( hEvent.preventDefault )
    {
	    hEvent.preventDefault()
    }
}


//event handlers
cElementResizer.prototype.onStartDrag = function() {}
cElementResizer.prototype.onStopDrag = function() {}
cElementResizer.prototype.onMove = function() {}
cElementResizer.prototype.onResize = function() {}