// Funzioni JavaScript per la gestione delle Forms

// Dichiarazione variabili per la gestione dello spostamento delle Form
var FormMoveOffsetX = 0;            // Offset X della posizione del mouse rispetto alla pagina
var FormMoveOffsetY = 0;            // Offset Y della posizione del mouse rispetto alla pagina
var FormMoveStartTop = 0;           // Posizione Top iniziale della form rispetto al suo container
var FormMoveStartLeft = 0;          // Posizione Left iniziale della form rispetto al suo container
var FormMoveStarted = false;        // Indica se è in corso l'operazione di spostamento
var FormMoveHandle = "";            // Handle della form per cui è in corso l'operazione di spostamento

// Dichiarazione variabili per la gestione del ridimensionamento delle form
var FormResizeOffsetX = 0;          // Offset X della posizione del mouse rispetto alla pagina
var FormResizeOffsetY = 0;          // Offset Y della posizione del mouse rispetto alla pagina
var FormResizeStartTop = 0;         // Posizione Top iniziale della form rispetto al suo container
var FormResizeStartLeft = 0;        // Posizione Left iniziale della form rispetto al suo container
var FormResizeStartWidth = 0;       // Larghezza iniziale della form
var FormResizeStartHeight = 0;      // Altezza inziale della form
var FormResizeStartBorder = "";     // Bordo della form da cui si stà eseguendo l'operazione di resize
var FormResizeMinimumWidth = 0;     // Larghezza minima della form
var FormResizeMinimumHeight = 0;    // Altezza minima della form
var FormResizeMaximumWidth = 0;     // Larghezza massima della form
var FormResizeMaximumHeight = 0;    // Altezza massima della form
var FormResizeBorderSize = 0;       // Dimensione del bordo del rettangolo di ridimensionamento
var FormResizeResizer = null;       // Elemento HTML di gestione del resize
var FormResizeStarted = false;      // Indica se è in corso l'operazione di ridimensionamento
var FormResizeHandle = "";          // Handle della form per cui è in corso l'operazione di ridimensionamento
var DocumentMouseMoveing = false;

function FormMoveStart(parClientX, parClientY, parHandle)
{
    // Imposta le informazioni iniziali per l'operazione di spostamento
    
    // parClientX           -> Coordinata client X
    // parClientY           -> Coordinata client Y
    // parHandle            -> Handle del layer esterno della form
        
    var tElement;
           
    //if ((!FormMoveStarted) && (GetMouseButton(e)==1))
    if (!FormMoveStarted)
    {
        // Preleva il puntatore all'elemento da spostare
        tElement = document.getElementById(parHandle);
    
        // Recupera le informazioni iniziali per l'operazione di spostamento
        if (tElement != null)
        {
            FormMoveOffsetX = parClientX;
            FormMoveOffsetY = parClientY;        
            FormMoveStartLeft = tElement.offsetLeft;
            FormMoveStartTop = tElement.offsetTop;
            FormMoveHandle = parHandle;
            FormMoveStarted = true;
        }
        
        // Libera le risorse
        tElement = null;
    }
}

function FormMoveExecute(e, parHandle)
{
    // Esegue lo spostamento della form
    
    // e            -> EventArgs di MouseMove
    // parHandle    -> Handle del layer esterno della form

    var tElement;
    var tTop;
    var tLeft;    

    if ((FormMoveStarted) && (FormMoveHandle == parHandle))
    {   
        if (GetMouseButton(e)==1)
        {
            // Preleva il puntatore all'elemento da spostare
            tElement = document.getElementById(parHandle);                        
            
            // Esegue lo spostamento della form
            if (tElement != null)
            {
                tTop = (FormMoveStartTop + (e.clientY - FormMoveOffsetY));
                if (tTop<0)
                    tTop = 0;
                 
                tLeft = (FormMoveStartLeft  + (e.clientX - FormMoveOffsetX)) 
                if (tLeft<0)
                    tLeft = 0;
                         
                tElement.style.top =  tTop + "px";
                tElement.style.left = tLeft + "px";
            }
            
            // Libera le risorse
            tElement = null;
        }
        else
        {
            FormMoveStop(null, parHandle)
        }
    }
}

function FormMoveStop(e, parHandle)
{
    // Termina lo spostamento della form
    
    // e            -> EventArgs di MouseMove
    // parHandle    -> Handle del layer esterno della form           
    
    var tElement;
    var tTop;
    var tLeft;
    var tWidth;
    var tHeight;
    var tSessionId;           
    
    if ((e == null) || ((FormMoveStarted) && (FormMoveHandle == parHandle) && (GetMouseButton(e)==1)))
    {
        // Preleva posizione e dimensione dell'elemento spostato
        tElement = document.getElementById(parHandle);
        if (tElement != null)
        {
            tTop = tElement.offsetTop;
            tLeft = tElement.offsetLeft;
            tWidth = tElement.offsetWidth;
            tHeight = tElement.offsetHeight;
            tElement = null;
    
            // Preleva il SessionId corrente
            tSessionId = document.getElementById("SessionId").value;
        
            // Invia le informazioni di posizione e dimensione al server
            SendCommand(tSessionId, parHandle, 1, "SetLocationAndSize", tTop + "|;" + tLeft + "|;" + tWidth + "|;" + tHeight);
            
        }
        FormMoveHandle = "";
        FormMoveStarted = false;
    }       
}

function FormResizeStart(parClientX, parClientY, parHandle, parParentHandle, parStartBorder, parBorderSize, parMinimumWidth, parMinimumHeight, parMaximumWidth, parMaximumHeight)
{
    // Imposta le informazioni iniziali per l'operazione di ridimensionamento
    
    // parClientX           -> Coordinata client X
    // parClientY           -> Coordinata client Y
    // parHandle            -> Handle del layer esterno della form
    // parParentHandle      -> Handle del container - se "" è il body del document
    // parStartBorder       -> Bordo di drag (N,S,W,E,NW,NE,SW,SE)
    // parBorderSize        -> Dimensione del bordo
    // parMinimumWidth      -> Larghezza minima della form
    // parMinimumHeight     -> Altezza minima della form
    // parMinimumWidth      -> Larghezza massima della form
    // parMinimumHeight     -> Altezza massima della form
    
    var tElement;
    var tHTML;
    var tCursor;
    
    if (!FormResizeStarted)
    {
        // Preleva il puntatore all'elemento di riferimento
        tElement = document.getElementById(parHandle);
        
        // Imposta le informazioni di ridimensionamento
        if (tElement != null)
        {
            FormResizeOffsetX = parClientX;
            FormResizeOffsetY = parClientY;
            FormResizeStartLeft = tElement.offsetLeft;
            FormResizeStartTop = tElement.offsetTop;
            FormResizeBorderSize = parBorderSize;
            FormResizeStartWidth = tElement.offsetWidth;
            FormResizeStartHeight = tElement.offsetHeight;
           
            FormResizeStartBorder = parStartBorder;
            
            // Si assicura di lavoare con interi (e non con stringhe)
            parMinimumWidth = parseInt(parMinimumWidth);
            parMinimumHeight = parseInt(parMinimumHeight);
            parMaximumWidth = parseInt(parMaximumWidth);
            parMaximumHeight = parseInt(parMaximumHeight);
            
            if (parMinimumWidth>0)
                FormResizeMinimumWidth = parMinimumWidth;
            else
                FormResizeMinimumWidth = 100;
            if (parMinimumHeight>0)
                FormResizeMinimumHeight = parMinimumHeight;
            else
                FormResizeMinimumHeight = 40;
            if (parMaximumWidth>0)
                FormResizeMaximumWidth = parMaximumWidth;
            else
                FormResizeMaximumWidth = 32767;
            if (parMaximumHeight>0)
                FormResizeMaximumHeight = parMaximumHeight;
            else
                FormResizeMinimumHeight = 32767;
            
            // Libera le risorse
            tElement = null;
                    
            // Definisce il render HTML del layer di resize
            tHTML = "";
            tHTML += "<div id=\"FormResizer\" style=\"";
            tHTML += "position: absolute;";
            tHTML += "top: " + FormResizeStartTop + "px;";
            tHTML += "left: " + FormResizeStartLeft + "px;";
            tHTML += "width: " + (FormResizeStartWidth - 2*FormResizeBorderSize) + "px;";
            tHTML += "height: " + (FormResizeStartHeight - 2*FormResizeBorderSize) + "px;";
            tHTML += "background-color: transparent;";
            tHTML += "border-top: silver " + parBorderSize + "px solid;";
            tHTML += "border-bottom: silver " + parBorderSize + "px solid;";
            tHTML += "border-left: silver " + parBorderSize + "px solid;";
            tHTML += "border-right: silver " + parBorderSize + "px solid;";
            tHTML += "z-index: 10000;";
            
            if (parStartBorder == "N")
            {
                tCursor = "n-resize";
            }
            else if (parStartBorder == "S")
            {
                tCursor = "s-resize";
            }
            else if (parStartBorder == "W")
            {
                tCursor = "w-resize";
            }
            else if (parStartBorder == "E")
            {
                tCursor = "e-resize";
            }
            else if (parStartBorder == "NW")
            {
                tCursor = "nw-resize";
            }
            else if (parStartBorder == "NE")
            {
                tCursor = "ne-resize";
            }
            else if (parStartBorder == "SW")
            {
                tCursor = "sw-resize";
            }
            else if (parStartBorder == "SE")
            {
                tCursor = "se-resize";
            }
            
            tHTML += "cursor: " + tCursor + ";";
            tHTML += "\" contenteditable=false unselectable=on></div>";
            
            // Aggiunge il layer di resize all'elemento parent
            if (parParentHandle!="")
                AddHandle(parParentHandle, tHTML);
            else
                AddHandle("ApplicationLayer", tHTML);                      
                  
            FormResizeResizer = document.getElementById("FormResizer");
                            
            // Imposta il cursore del document
            document.getElementById("ApplicationLayer").style.cursor = tCursor;

            // Imposta la sessione di resize
            FormResizeHandle = parHandle;
            FormResizeStarted = true;                
        }
    }        
}

function FormResizeExecute(e, parHandle)
{
    // Esegue il ridimensionamento della form
    
    // e            -> EventArgs di MouseMove
    // parHandle    -> Handle del layer esterno della form    

    var tTop;
    var tLeft;
    var tWidth;
    var tHeight;    

    if ((FormResizeStarted) && (FormResizeHandle == parHandle) && (FormResizeResizer!=null))
    {
        if (FormResizeStartBorder == "N")
        {
            
            // Calcola posizione e dimensione del leyer resizer
            tTop = FormResizeStartTop + (e.clientY - FormResizeOffsetY);
            tLeft = FormResizeStartLeft;
            tWidth = FormResizeStartWidth;
            tHeight = FormResizeStartHeight - (e.clientY - FormResizeOffsetY)
                            
            // Controlla l'altezza minima
            if (tHeight<FormResizeMinimumHeight)
            {
                tTop -= FormResizeMinimumHeight - tHeight;
                tHeight = FormResizeMinimumHeight;
            }
            
            // Controlla l'altezza massima
            if (tHeight>FormResizeMaximumHeight)
            {
                tTop -= FormResizeMaximumHeight - tHeight;
                tHeight = FormResizeMaximumHeight;
            }
            
            // Controlla il bordo superiore
            if (tTop<0)
            {                                        
                tTop=0;
                tHeight = FormResizeStartTop + FormResizeStartHeight;
            }
        }
        else if (FormResizeStartBorder == "S")
        {
            // Calcola posizione e dimensione del leyer resizer
            tTop = FormResizeStartTop;
            tLeft = FormResizeStartLeft;
            tWidth = FormResizeStartWidth;
            tHeight = FormResizeStartHeight + (e.clientY - FormResizeOffsetY)
        
            // Controlla l'altezza minima
            if (tHeight<FormResizeMinimumHeight)            
                tHeight = FormResizeMinimumHeight;            
                
            // Controlla l'altezza massima
            if (tHeight>FormResizeMaximumHeight)
                tHeight = FormResizeMaximumHeight;
        }
        else if (FormResizeStartBorder == "W")
        {
            // Calcola posizione e dimensione del leyer resizer
            tTop = FormResizeStartTop;
            tLeft = FormResizeStartLeft + (e.clientX - FormResizeOffsetX);
            tWidth = FormResizeStartWidth - (e.clientX - FormResizeOffsetX);
            tHeight = FormResizeStartHeight;
        
            // Controlla la larghezza minima
            if (tWidth<FormResizeMinimumWidth)
            {
                tLeft -= FormResizeMinimumWidth - tWidth;
                tWidth = FormResizeMinimumWidth;
            }
            
            // Controlla la larghezza massima
            if (tWidth>FormResizeMaximumWidth)
            {
                tLeft -= FormResizeMaximumWidth - tWidth;
                tWidth = FormResizeMaximumWidth;
            }
            
            // Controlla il bordo sinistro
            if (tLeft<0)
            {                                        
                tLeft=0;
                tWidth = FormResizeStartLeft + FormResizeStartWidth;
            }
        }
        else if (FormResizeStartBorder == "E")
        {
            // Calcola posizione e dimensione del leyer resizer
            tTop = FormResizeStartTop;
            tLeft = FormResizeStartLeft;
            tWidth = FormResizeStartWidth + (e.clientX - FormResizeOffsetX);
            tHeight = FormResizeStartHeight;
        
            // Controlla la larghezza minima
            if (tWidth<FormResizeMinimumWidth)
                tWidth = FormResizeMinimumWidth;
                
            // Controlla la larghezza massima
            if (tWidth>FormResizeMaximumWidth)
                tWidth = FormResizeMaximumWidth;            
        }
        else if (FormResizeStartBorder == "NW")
        {
            // Calcola posizione e dimensione del leyer resizer
            tTop = FormResizeStartTop + (e.clientY - FormResizeOffsetY);
            tLeft = FormResizeStartLeft + (e.clientX - FormResizeOffsetX);
            tWidth = FormResizeStartWidth - (e.clientX - FormResizeOffsetX);
            tHeight = FormResizeStartHeight - (e.clientY - FormResizeOffsetY)
        
            // Controlla l'altezza minima
            if (tHeight<FormResizeMinimumHeight)
            {
                tTop -= FormResizeMinimumHeight - tHeight;
                tHeight = FormResizeMinimumHeight;
            }
            
            // Controlla l'altezza massima
            if (tHeight>FormResizeMaximumHeight)
            {
                tTop -= FormResizeMaximumHeight - tHeight;
                tHeight = FormResizeMaximumHeight;
            }
            
            // Controlla il bordo superiore
            if (tTop<0)
            {                                        
                tTop=0;
                tHeight = FormResizeStartTop + FormResizeStartHeight;
            }
        
            // Controlla la larghezza minima
            if (tWidth<FormResizeMinimumWidth)
            {
                tLeft -= FormResizeMinimumWidth - tWidth;
                tWidth = FormResizeMinimumWidth;
            }
            
            // Controlla la larghezza massima
            if (tWidth>FormResizeMaximumWidth)
            {
                tLeft -= FormResizeMaximumWidth - tWidth;
                tWidth = FormResizeMaximumWidth;
            }
            
            // Controlla il bordo sinistro
            if (tLeft<0)
            {                                        
                tLeft=0;
                tWidth = FormResizeStartLeft + FormResizeStartWidth;
            }
        }
        else if (FormResizeStartBorder == "NE")
        {
            // Calcola posizione e dimensione del leyer resizer
            tTop = FormResizeStartTop + (e.clientY - FormResizeOffsetY);
            tLeft = FormResizeStartLeft;
            tWidth = FormResizeStartWidth + (e.clientX - FormResizeOffsetX);
            tHeight = FormResizeStartHeight - (e.clientY - FormResizeOffsetY)

            // Controlla l'altezza minima
            if (tHeight<FormResizeMinimumHeight)
            {
                tTop -= FormResizeMinimumHeight - tHeight;
                if (tTop<0)
                    tTop=0;                    
                tHeight = FormResizeMinimumHeight;
            }
            
            // Controlla l'altezza massima
            if (tHeight>FormResizeMaximumHeight)
            {
                tTop -= FormResizeMaximumHeight - tHeight;
                if (tTop<0)
                    tTop=0;                    
                tHeight = FormResizeMaximumHeight;
            }
            
            // Controlla la larghezza minima
            if (tWidth<FormResizeMinimumWidth)
                tWidth = FormResizeMinimumWidth;
                
            // Controlla la larghezza massima
            if (tWidth>FormResizeMaximumWidth)
                tWidth = FormResizeMaximumWidth;
        }
        else if (FormResizeStartBorder == "SW")
        {
            // Calcola posizione e dimensione del leyer resizer
            tTop = FormResizeStartTop;
            tLeft = FormResizeStartLeft + (e.clientX - FormResizeOffsetX);
            tWidth = FormResizeStartWidth - (e.clientX - FormResizeOffsetX);
            tHeight = FormResizeStartHeight + (e.clientY - FormResizeOffsetY)
        
            // Controlla l'altezza minima
            if (tHeight<FormResizeMinimumHeight)
                tHeight = FormResizeMinimumHeight;
        
            // Controlla l'altezza massima
            if (tHeight>FormResizeMaximumHeight)
                tHeight = FormResizeMaximumHeight;
        
            // Controlla la larghezza minima
            if (tWidth<FormResizeMinimumWidth)
            {
                tLeft -= FormResizeMinimumWidth - tWidth;
                tWidth = FormResizeMinimumWidth;
            }
            
            // Controlla la larghezza massima
            if (tWidth>FormResizeMaximumWidth)
            {
                tLeft -= FormResizeMaximumWidth - tWidth;
                tWidth = FormResizeMaximumWidth;
            }
        }
        else if (FormResizeStartBorder == "SE")
        {
            // Calcola posizione e dimensione del leyer resizer
            tTop = FormResizeStartTop;
            tLeft = FormResizeStartLeft;
            tWidth = FormResizeStartWidth + (e.clientX - FormResizeOffsetX);
            tHeight = FormResizeStartHeight + (e.clientY - FormResizeOffsetY)
        
            // Controlla l'altezza minima
            if (tHeight<FormResizeMinimumHeight)
                tHeight = FormResizeMinimumHeight;
                
            // Controlla l'altezza massima
            if (tHeight>FormResizeMaximumHeight)
                tHeight = FormResizeMaximumHeight;
        
            // Controlla la larghezza minima
            if (tWidth<FormResizeMinimumWidth)
                tWidth = FormResizeMinimumWidth;
                
            // Controlla la larghezza massima
            if (tWidth>FormResizeMaximumWidth)
                tWidth = FormResizeMaximumWidth;
        }            

        FormResizeResizer.style.top = tTop + "px";
        FormResizeResizer.style.left = tLeft + "px";
        FormResizeResizer.style.width = (tWidth - 2*FormResizeBorderSize) + "px";
        FormResizeResizer.style.height = (tHeight - 2*FormResizeBorderSize) + "px";
    }
}

function FormResizeStop(e, parHandle)
{
    // Termina l'operazione di ridimensionamento della form
    
    // e            -> EventArgs di MouseMove
    // parHandle    -> Handle del layer esterno della form
    
    var tElement;
    var tTop;
    var tLeft;
    var tWidth;
    var tHeight;
    var tSessionId;
    
    if ((FormResizeStarted) && (FormResizeHandle == parHandle) && (FormResizeResizer!=null) && (GetMouseButton(e)==1))
    {   
        tTop = FormResizeResizer.offsetTop;
        tLeft = FormResizeResizer.offsetLeft;
        tWidth = FormResizeResizer.offsetWidth;
        tHeight = FormResizeResizer.offsetHeight;
                         
        // Ridimensiona la form
        tElement = document.getElementById(parHandle);
        if (tElement != null)
        {
            tElement.style.top = tTop + "px";
            tElement.style.left = tLeft + "px";
            tElement.style.width = tWidth + "px";
            tElement.style.height = tHeight + "px";
        }

        // Rimuove il layer di resize
        if (FormResizeResizer!=null)
        {
            FormResizeResizer.parentNode.removeChild(FormResizeResizer);
            FormResizeResizer = null;
        }
                
        // Reimposta il cursore del document
        document.getElementById("ApplicationLayer").style.cursor = "";
        
        // Termina la sessione di ridimensionamento                
        FormResizeHandle = "";
        FormResizeStarted = false;
        
        if (tElement != null)
        {
            // Preleva il SessionId corrente
            tSessionId = document.getElementById("SessionId").value;
            
            // Invia le informazioni di posizione e dimensione al server
            SendCommand(tSessionId, parHandle, 1, "SetLocationAndSize", tTop + "|;" + tLeft + "|;" + tWidth + "|;" + tHeight);
        }
        
        // Libera le risorse
        tElement = null;
    }       
}
