/* 
	....................................................
	title:		    PopUpBox.js
	version:	    1.4.7
	author:		    Simone Scigliuzzi
	description:	JavaScript overlay based PopUpBox
	copyright:      Copyright © 2001-2009 SimoneVB ® - Simone Scigliuzzi  (http://www.simonevb.it)
	....................................................
*/

var k_OVERLAY_ID = 'popupbox147_overlay';
var k_CONTAINER_ID = 'popupbox147_container';
var k_STEP_OPACITY = .25;
var k_STEP_OPACITY_MS = .25;

var m_onBeforeLoad = null;              // handler functions
var m_onAfterLoad = null;
var m_onClick = null;
var m_onBeforeClose = null;
var m_onAfterClose = null;

var m_OverlayBgColor = '#000';         // properties
var m_backgroundColor = '#fff';
var m_Opacity = 0.8;
var m_AppearFX = true;
var m_CloseTimeout = 0;
var m_CloseButton = true;
var m_CloseTitle = 'Chiudi';
var m_CloseButtonOnBottom = false;
var m_Delay = 600;
var m_EnableContextMenu = false;
var m_Fixed = false;

var m_OverlayLoaded = false;            // control
var m_BackUpHtml = null;
var m_BackUpElementID = null;
var m_targetOpacity = 0;
var m_curOpacity = 0;
var t = null;
var m_ForceClosing = false;
var m_DontClose = false;
var m_tmpAppearFX = true;
var m_tmpDelay = 600;

// PopUpBox class
function PopUpBox() {

    // costruttore

    // handlers
    this.onBeforeLoad = function onBeforeLoad(handler) { m_onBeforeLoad = handler; }
    this.onAfterLoad = function onAfterLoad(handler) { m_onAfterLoad = handler; }
    this.onClick = function onClick(handler) { m_onClick = handler; }
    this.onBeforeClose = function onBeforeClose(handler) { m_onBeforeClose = handler; }
    this.onAfterClose = function onAfterClose(handler) { m_onAfterClose = handler; }

    // methods
    this.overlayBgColor = function overlayBgColor(bgcolor) { m_OverlayBgColor = bgcolor; }
    this.backgroundColor = function backgroundColor(bgcolor) { m_backgroundColor = bgcolor; }
    this.opacity = function opacity(opacity) { m_Opacity = opacity; }
    this.appearFX = function appearFX(appearFx) { m_AppearFX = appearFx; }
    this.closeTimeout = function closeTimeout(closeTimeout) { m_CloseTimeout = closeTimeout; }
    this.closeButton = function closeButton(closeButton) { m_CloseButton = closeButton; }
    this.closeTitle = function closeTitle(stitle) { m_CloseTitle = stitle; }
    this.closeButtonOnBottom = function closeButtonOnBottom(closebntonbottom) { m_CloseButtonOnBottom = closebntonbottom; }
    this.delay = function delay(jdelay) { m_Delay = jdelay; }
    this.enableContextMenu = function enableContextMenu(enable) {m_EnableContextMenu = enable; }
    this.fixed = function fixed(bFixed) { m_Fixed = bFixed; }
    
    
    // show
    this.Show = function Show(elementID, byCopy) {
        // mostra PopUpBox

        var html = null;

        if (!overlayExists()) {
            // crea elementi se non esiste la struttura
            createContainer();
            createOverlay();
        }
        else if (isVisible()) {
            // PopUpBox aperto e visibile. forza chiusura
            m_ForceClosing = true;
            this.Close();
        }

        // normalizza parametri e resetta variabili di controllo
        if (byCopy == null) byCopy = false;
        m_ForceClosing = false;
        m_BackUpHtml = null;
        m_BackUpElementID = null;

        // evento onBeforeLoad
        if (m_onBeforeLoad != null && m_onBeforeLoad != '') eval(m_onBeforeLoad);

        // estrae html (termina se l'elemento NON esiste o NON contiene html)
        if (document.getElementById(elementID) == null) return false;
        html = document.getElementById(elementID).innerHTML;

        if (html == null || html == '') return false;

        // se NON carica html in copia, fa il backup dell'id elemento e dell'html
        // fa il backup dell'html, dell'id dell'elemento e cancella l'elemento
        if (!byCopy) {
            m_BackUpHtml = html;
            m_BackUpElementID = elementID;
            document.getElementById(elementID).innerHTML = '';
        }
        
        // normalizza proprietą
        if (m_OverlayBgColor == null || m_OverlayBgColor == '') m_OverlayBgColor = '#000';
        if (m_backgroundColor == null || m_backgroundColor == '') m_backgroundColor = '#fff';
        if (m_Opacity == null) m_Opacity = 0.8; if (m_Opacity < 0) m_Opacity = 0; if (m_Opacity > 1) m_Opacity = 1;
        if (m_AppearFX == null) m_AppearFX = false;
        if (m_CloseTimeout == null) m_CloseTimeout = 0; if (m_CloseTimeout < 0) m_CloseTimeout = 0;
        if (m_CloseButton == null) m_CloseButton = true;
        if (m_CloseTitle == null) m_CloseTitle = 'Chiudi';  if (m_CloseTitle == '') m_CloseTitle = '';  // title predefinito o blank
        if (m_CloseButtonOnBottom == null) m_CloseButtonOnBottom = false;
        if (m_Delay == null) m_Delay = 600; if (m_Delay < 0) m_Delay = 0;
        if (m_EnableContextMenu == null) m_EnableContextMenu = false;
        
        m_tmpAppearFX = m_AppearFX;
        m_tmpDelay = m_Delay;
        
        // se il backgroundColor dell'overlay č transparent,
        // elimina effetto appear
        if (m_OverlayBgColor.toLowerCase() == 'transparent') m_tmpAppearFX = false;

        // se il backgroundColor del PopUpBox č transparent e anche quello dell'overlay,
        // elimina effetto appear e azzera delay
        if ((m_backgroundColor.toLowerCase() == 'transparent') && (m_OverlayBgColor.toLowerCase() == 'transparent'))
        {
            m_tmpAppearFX = false;
            m_tmpDelay = 0;
        }
                
        // calcola opacizzazione iniziale e finale
        m_targetOpacity = m_Opacity;
        if (m_tmpAppearFX)
            m_curOpacity = 0 - k_STEP_OPACITY;
        else
            m_curOpacity = m_Opacity;

        // referenzia overlay e container e nasconde pulsanti Close
        var elOverlay = document.getElementById(k_OVERLAY_ID);
        var elContainer = document.getElementById(k_CONTAINER_ID);

        document.getElementById(k_CONTAINER_ID + 'closetop').style.visibility = 'hidden';
        document.getElementById(k_CONTAINER_ID + 'closetop').title = m_CloseTitle;
        document.getElementById(k_CONTAINER_ID + 'closebottom').style.visibility = 'hidden';
        document.getElementById(k_CONTAINER_ID + 'closebottom').title = m_CloseTitle;

        // genera il contenitore dell'html, lo mantiene invisibile e vi inietta l'html da caricare
        var injHtml = '<table id="' + k_CONTAINER_ID + 'box_datacontainer"';
        injHtml += ' style="visibility:hidden;">';
        injHtml += '<tr><td>' + html;
        injHtml += '</td></tr></table>';
        document.getElementById(k_CONTAINER_ID + 'box').innerHTML = injHtml;

        // regola altezza overlay centrando orizzontalmente il container
        // imposta backgroundColor dei overlay e box e imposta opacizzazione iniziale dell'overlay
        m_OverlayLoaded = true;
        resizePopUpBox();

        elOverlay.style.backgroundColor = m_OverlayBgColor;
        document.getElementById(k_CONTAINER_ID + 'box').style.backgroundColor = m_backgroundColor;
        setElementOpacity(elOverlay, m_curOpacity);

        // se il backgroundColor č transparent, scarica il loader
        if (m_backgroundColor.toLowerCase() == 'transparent') document.getElementById(k_CONTAINER_ID + 'box').style.backgroundImage = 'url("")';

        // visualizza overlay (solo se non č transparent) e container
        if (m_OverlayBgColor.toLowerCase() != 'transparent') elOverlay.style.visibility = 'visible';
        elContainer.style.visibility = 'visible';

        // avvia incremento opacizzazione overlay
        setTimeout("increaseOpacity();", k_STEP_OPACITY_MS);
    }

    // Close
    this.Close = function Close() {
        // Chiude PopUpBox
        PopUpBoxClose();
    }


    // privates
    function overlayExists() {
        // restituisce true se l'overlay esiste
        return (document.getElementById(k_OVERLAY_ID) != null);
    }

    function isVisible() {
        // restituisce true se l'overlay esiste ed č visibile
        if (!overlayExists()) return false;
        return (document.getElementById(k_OVERLAY_ID).style.visibility == 'visible');
    }

    function createOverlay() {
        // crea overlay
        var html = '<div id="' + k_OVERLAY_ID + '"';
        html += ' style="position:absolute; left:0px; top:0px; width:100%; height:100%; background-color:#000;';
        html += ' visibility:hidden; z-index:9998;"';
        html += ' onclick="return false;" onmousedown="return false;" onmousemove="return false;" onmouseup="return false;" ondblclick="return false;" oncontextmenu="return false;">';
        html += '</div>';
        
        var overlay = document.createElement("div");
        document.body.appendChild(overlay);
        
        // crea div fittizio in cui inietta la table
        var oDummyElement = document.createElement("div");
        document.body.appendChild(oDummyElement);
        oDummyElement.innerHTML = html;
        oDummyElement = document.getElementById(k_OVERLAY_ID);
        
        document.body.replaceChild(oDummyElement, overlay);
    }

    function createContainer() {
        // crea ContainerBox
        var sEnableCM = '';
        if (!m_EnableContextMenu) sEnableCM = ' oncontextmenu="return false;"';     // abilita/disabilita contextmenu nel container

        var html = '<table id="' + k_CONTAINER_ID + '"';
        html += ' style="position:'
        if (m_Fixed)
            html += 'fixed';        // xhtml fixed position
        else
            html += 'absolute';

        html += '; margin-left:auto; margin-right:auto; visibility:hidden; z-index:9999;"' + sEnableCM + '>';
        html += '<tr><td></td><td id="' + k_CONTAINER_ID + 'closetop" class="' + k_CONTAINER_ID + 'close" style="visibility:visible;" title="Chiudi" onClick="PopUpBoxClose();"></td></tr>';
        html += '<tr><td id="' + k_CONTAINER_ID + 'box" colspan="2" onClick="doBoxClick();"';
        html += ' style="text-align:center; vertical-align:middle;"></td></tr>';
        html += '<tr><td></td><td id="' + k_CONTAINER_ID + 'closebottom" class="' + k_CONTAINER_ID + 'close" style="visibility:visible;" title="Chiudi" onClick="PopUpBoxClose();"></td></tr>';
        html += '</table>';

        // crea elemento table
        var container = document.createElement("table");
        document.body.appendChild(container);
        
        // crea div fittizio in cui inietta la table
        var oDummyElement = document.createElement("div");
        document.body.appendChild(oDummyElement);
        oDummyElement.innerHTML = html;
        oDummyElement = document.getElementById(k_CONTAINER_ID);

        document.body.replaceChild(oDummyElement, container);
    }
}


// ...................................
// globals
// ...................................

//
function PopUpBoxClose() {
    // Chiude PopUpBox

    // se forza chiusura (richiesto da Show), distrugge immediatamente PopUpBox
    if (m_ForceClosing) {
        destroyPopUpBox();
        return;
    }

    // resetta var.bool cancel-close e scatena evento onBeforeClose
    m_DontClose = false;
    if (m_onBeforeClose != null && m_onBeforeClose != '') eval(m_onBeforeClose);
    if (m_DontClose)
    {
        // ripristina flag per prossimo evento e annulla chiusura
        m_DontClose = false;
        return;
    }
    
    // continua a chiudere: resetta timeout per chiusura automatica
    if (t != null) clearTimeout(t);

    // nasconde pulsanti Close e DataContainer
    document.getElementById(k_CONTAINER_ID + 'closetop').style.visibility = 'hidden';
    document.getElementById(k_CONTAINER_ID + 'closebottom').style.visibility = 'hidden';
    document.getElementById(k_CONTAINER_ID + 'box_datacontainer').style.visibility = 'hidden';

    // calcola opacizzazione iniziale e finale
    m_targetOpacity = 0;
    if (m_tmpAppearFX)
        m_curOpacity = m_Opacity;
    else
        m_curOpacity = 0;

    // avvia decremento opacizzazione overlay
    setTimeout("decreaseOpacity();", m_tmpDelay);
}

//
function PopUpBoxCancelClose()
{
    // annulla chiusura
    m_DontClose = true;
}

//
function doBoxClick()
{
    // richiamata al click sul box, scatena evento click
    if (m_onClick != null && m_onClick != '') eval(m_onClick);
}
    
//
function resizePopUpBox() {
    // regola altezza overlay e centra orizzontalmente il container
    // n.b: xhtml richiede l'unitą di misura (px)
    if (!m_OverlayLoaded) return;    
    document.getElementById(k_OVERLAY_ID).style.height = getPageSize()[1] + 'px';
    document.getElementById(k_CONTAINER_ID).style.left = ((document.body.offsetWidth - document.getElementById(k_CONTAINER_ID).offsetWidth) / 2) + 'px';
}

//
function destroyPopUpBox() {
    // distrugge PopUpBox

    // nasconde container, pulsanti Close e overlay e cancella contenuto del box
    document.getElementById(k_CONTAINER_ID).style.visibility = 'hidden';
    document.getElementById(k_CONTAINER_ID + 'closetop').style.visibility = 'hidden';
    document.getElementById(k_CONTAINER_ID + 'closebottom').style.visibility = 'hidden';
    document.getElementById(k_OVERLAY_ID).style.visibility = 'hidden';
    document.getElementById(k_CONTAINER_ID + 'box').innerHTML = '';

    // ripristina html nell'elemento di origine se NON era in copia e resetta relative variabili
    if (m_BackUpElementID != null) document.getElementById(m_BackUpElementID).innerHTML = m_BackUpHtml;
    m_BackUpElementID = null;
    m_BackUpHtml = null;

    // elimina overlay e container
    var elOverlay = document.getElementById(k_OVERLAY_ID);
    var elContainer = document.getElementById(k_CONTAINER_ID);
    
    document.body.removeChild(elOverlay);
    document.body.removeChild(elContainer);
    
    // evento onAfterClose
    if (m_onAfterClose != null && m_onAfterClose != '') eval(m_onAfterClose);
}

//
function getPageSize() {
    // funzione cross-browser per calcolare dimensioni pagina
    var xScroll, yScroll;

    if (window.innerHeight && window.scrollMaxY) {
        xScroll = window.innerWidth + window.scrollMaxX;
        yScroll = window.innerHeight + window.scrollMaxY;
    } else if (document.body.scrollHeight > document.body.offsetHeight) { // all but Explorer Mac
        xScroll = document.body.scrollWidth;
        yScroll = document.body.scrollHeight;
    } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
        xScroll = document.body.offsetWidth;
        yScroll = document.body.offsetHeight;
    }

    var windowWidth, windowHeight;

    if (self.innerHeight) {	// all except Explorer
        if (document.documentElement.clientWidth) {
            windowWidth = document.documentElement.clientWidth;
        } else {
            windowWidth = self.innerWidth;
        }
        windowHeight = self.innerHeight;
    } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
        windowWidth = document.documentElement.clientWidth;
        windowHeight = document.documentElement.clientHeight;
    } else if (document.body) { // other Explorers
        windowWidth = document.body.clientWidth;
        windowHeight = document.body.clientHeight;
    }

    // for small pages with total height less then height of the viewport
    if (yScroll < windowHeight) {
        pageHeight = windowHeight;
    } else {
        pageHeight = yScroll;
    }

    // for small pages with total width less then width of the viewport
    if (xScroll < windowWidth) {
        pageWidth = xScroll;
    } else {
        pageWidth = windowWidth;
    }

    return [pageWidth, pageHeight];
}

//
function setElementOpacity(element, alpha) {
    /// Funzione cross-browser che imposta la trasparenza dell'elemento element
    var style = element.style;

    if (style.MozOpacity != undefined) {
        // Mozzilla and older
        style.MozOpacity = alpha;
    }
    else if (style.filter != undefined) {
        //IE
        style.filter = "alpha(opacity=0)";
        element.filters.alpha.opacity = (alpha * 100);
    }
    else if (style.opacity != undefined) {
        //Opera
        style.opacity = alpha;
    }
}

//
function increaseOpacity() {
    // incrementa opacizzazione dell'overlay
    var nextTimer = 0;

    if (m_curOpacity < 0) nextTimer = parseInt(m_tmpDelay / 2);
    if (m_curOpacity == 0) nextTimer = k_STEP_OPACITY_MS;
    if (m_curOpacity == m_targetOpacity) nextTimer = m_tmpDelay;
    if (m_curOpacity > m_targetOpacity) nextTimer = k_STEP_OPACITY_MS;

    if (m_curOpacity >= m_targetOpacity) {

        // fine incremento:
        if (m_curOpacity > m_targetOpacity) {
            // solo quando supera l'opacizzazione finale
            // aggiorna dato opacizzazione corrente, mostra ContainerBox_DataContainer e CloseButton (se richiesto)
            m_curOpacity = m_targetOpacity;
            document.getElementById(k_CONTAINER_ID + 'box_datacontainer').style.visibility = 'visible';
            
            // mostra puls.close
            if (m_CloseButton)
            {
                var pulsID = 'top';
                if (m_CloseButtonOnBottom) pulsID = 'bottom';
                document.getElementById(k_CONTAINER_ID + 'close' + pulsID).style.visibility = 'visible';
            }
            
            // evento onAfterLoad e pianifica chiusura con timeout
            if (m_onAfterLoad != null && m_onAfterLoad != '') eval(m_onAfterLoad);
            if (m_CloseTimeout > 0) t = setTimeout("PopUpBoxClose();", m_CloseTimeout);
        }
        else {
            // fine opacizzazione raggiunta, rinnova incremento (fittizio) senza modificare opacizzazione, per prolungare attesa
            m_curOpacity += k_STEP_OPACITY;
            setTimeout("increaseOpacity();", nextTimer);
        }

        return;
    }

    // incrementa e modifica opacizzazione
    // e rinnova incremento opacizzazione
    m_curOpacity += k_STEP_OPACITY;
    if (m_curOpacity > m_targetOpacity) m_curOpacity = m_targetOpacity;
    setElementOpacity(document.getElementById(k_OVERLAY_ID), m_curOpacity);
    setTimeout("increaseOpacity();", nextTimer);
}

//
function decreaseOpacity() {
    // decrementa opacizzazione dell'overlay

    if (m_curOpacity > 0) {
        // decrementa e modifica opacizzazione
        m_curOpacity -= k_STEP_OPACITY;
        if (m_curOpacity < 0) m_curOpacity = 0;
        setElementOpacity(document.getElementById(k_OVERLAY_ID), m_curOpacity);
        setTimeout("decreaseOpacity();", k_STEP_OPACITY_MS);
        return;
    }
    else {
        // fine effetto
        destroyPopUpBox();
    }
}


// handler per resize
window.onresize = resizePopUpBox;
