﻿/*
Following modal modified by Robert Fuess - a derivative of the original lightbox

HOW to use

<p><a href="javascript:void(openModal('Test_modal.htm',300,200))">Click here</a></p>

*/

var _refreshOnClose = false;
var _functDoOnClose = null;
var _frameName = "modalIframe";
var _isMaximized = false;
var _toolbarHeight = 20;
var _modalToolbar = "<div onmousedown=\"dragStart(event, 'modalDiv')\" id=\"modalToolbar\" style=\"height:" + _toolbarHeight + ";\"><span id='ajaxLoader' class='ajaxLoading'> <\/span><span id=\"modalTitle\">$title$<\/span><span id=\"modalButtons\"><a id='modalMinBtn' href=\"javascript:void(minimizeModal())\">_<\/a>&nbsp;<a id=\"maximizeModal\" href=\"javascript:void(maximizeModal())\"> &nbsp; </a>&nbsp;<a id='modalCloseBtn' href=\"javascript:void(closeModal())\">x<\/a><\/span><\/div>";
var _modalZIndex = 9921;
var _disableBgColor = "gray";

function modalInit() {
    modalAddLoadEvent(function() {
        
        //ensure divs are there
        try {
            $(window).resize(function() {
                repositionModal();
            });
        } catch (ex) {
            window.onresize = repositionModal;
        }

        var modalObj = getDomObjModal("modalDiv");
        if (modalObj == false) {
            var blankText = document.createTextNode(" ");
            var modalDiv = document.createElement("div");
            var disableLayer = document.createElement("div");

            modalDiv.setAttribute('id', 'modalDiv');
            modalDiv.setAttribute('style', 'position:absolute;display:none;visibility:hidden;overflow:auto;');
            modalDiv.appendChild(blankText);

            disableLayer.setAttribute('id', 'disableLayer');
            disableLayer.setAttribute('style', 'position:absolute;display:none;visibility:hidden;overflow:auto;');
            disableLayer.appendChild(blankText);

            document.body.appendChild(modalDiv);
            document.body.appendChild(disableLayer);
        }
    });
}


function modalAddLoadEvent(func) {
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = func;
    } else {
        window.onload = function() {
            if (oldonload) {
                oldonload();
            }
            func();
        }
    }
}


function SetFrameName(newName) {
    _frameName = newName;
}
//close modal window....
function closeModal() {
    _isMaximized = false;
    try {
       getDomObjModal('disableLayer').style.display = 'none';
       getDomObjModal('disableLayer').style.visibility = "hidden";
       getDomObjModal('modalDiv').style.display = 'none';
       getDomObjModal('modalDiv').style.visibility = "hidden";       
       getDomObjModal('modalDiv').innerHTML="<div>&nbsp;</div>";
       if (typeof _functDoOnClose == 'function') {
           try {
             _functDoOnClose();
           } catch(ex) {}
       }

   } catch (exc) { }
    
    return false;
}

var _winW = 630, _winH = 600; //default
// ref: http://www.howtocreate.co.uk/tutorials/javascript/browserwindow        
function calculateWindowDimensions() 
{
    if (typeof (window.innerWidth) == 'number') {
        //Non-IE
        _winW = window.innerWidth;
        _winH = window.innerHeight;
    } else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
        //IE 6+ in 'standards compliant mode'
       _winW = document.documentElement.clientWidth;
       _winH = document.documentElement.clientHeight;
    } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
        //IE 4 compatible
        _winW = document.body.clientWidth;
        _winH = document.body.clientHeight;
    }
}

//get dom object item
function getDomObjModal(objId) {
    if (document.all && document.all[objId]) {
       return document.all[objId];
    } else if (document.getElementById && document.getElementById(objId)) {
       return document.getElementById(objId);
    } else {
       return false;
    }
}

function minimizeModal() {
    _isMaximized = false;
    calculateWindowDimensions();

    var newModalHeight = _modalHeight;
    var newModalWidth = _modalWidth;
    
    var modalObj = getDomObjModal("modalDiv");
    var iframeObj = getDomObjModal(_frameName);

    if (modalObj != false) {
        divExists = true;
    }

    //get div for disabling layer
    var disableLayer;
    if (divExists) {
        modalObj.style.width = newModalWidth + "px";
        modalObj.style.height = newModalHeight + "px";
        var iframeHeight = newModalHeight - _toolbarHeight;
        iframeObj.style.height = iframeHeight + "px";
    }

    repositionModal();

    return false;
}

function maximizeModal() {
    _isMaximized = true;
    calculateWindowDimensions();

    _modalWidthMax = .95 * _winW;
    _modalHeightMax = .9 * _winH;
    
    var modalObj = getDomObjModal("modalDiv");
    var iframeObj = getDomObjModal("modalIframe");
    
    if (modalObj != false) {
        divExists = true;
    }

    //get div for disabling layer
    var disableLayer;
    if (divExists) {
        modalObj.style.width = _modalWidthMax + "px";
        modalObj.style.height = _modalHeightMax + "px";
        var iframeHeight = _modalHeightMax - _toolbarHeight;
        iframeObj.style.height = iframeHeight + "px";
    }

    repositionModal();
    return false;
}

//used for resizing of window...
//  wired up when call modalInit
function repositionModal() {

    //get div for modal
    var divExists = false;
    var divVisible = false;

    var modalWidth = _modalWidth;
    var modalHeight = _modalHeight;
    if (_isMaximized) {
        modalWidth = _modalWidthMax;
        modalHeight = _modalHeightMax;
    }
    
    var modalObj = getDomObjModal("modalDiv");
    var disableLayer = getDomObjModal("disableLayer");
    if (modalObj != false && disableLayer!=false) {
        divExists = true;
    }    
    
    try {
      divVisible = modalObj.style.display == "block";
    } catch(ex) { }

    if (divVisible) {
        var ht = getDocHeight();
        
        disableLayer.style.height = ht + 'px';
        disableLayer.style.width = "100%";

        //adjust height for padding...        
        modalObj.style.visibility = "visible";
        
        calculateWindowDimensions(); 

        var modTop = (_winH - modalHeight) / 2;
        var modLeft = (_winW - modalWidth) / 2;

        modalObj.style.top = modTop + 'px'; //'5%'
        modalObj.style.left = modLeft + 'px';
    }
}

var _modalWidth = 0;
var _modalHeight = 0;
var _modalWidthMax = 0;
var _modalHeightMax = 0;
var _iframePadding = 10;


function openModal(modalTitle, modalUrl, modalHeight, modalWidth, functDoOnClose) {
    _isMaximized = false;
    try {
       scroll(0, 0); //try scrolling to top.
    } catch(ex) {}    
    
    if (typeof (functDoOnClose) == 'function') {
        _functDoOnClose = functDoOnClose;
    } else {
        _functDoOnClose = false;
    }

    //get div for modal
    var divExists = false;
    var modalObj = getDomObjModal("modalDiv");
    var disableLayer = getDomObjModal("disableLayer");
    if (modalObj != false && disableLayer != false) {
        divExists = true;
    }    
    
    if (!divExists) {
        alert("missing div: id=modalDiv or disableLayer");
        return;
    }    

    var ht = getDocHeight();

    //get what to write into modal
    var iframeWidth = modalWidth;
    var iframeHeight = modalHeight -  _toolbarHeight;
    modalObj.innerHTML = '<div>' + _modalToolbar.replace("$title$", modalTitle) + '<iframe  onload="modalOpened();" id="modalIframe" name="' + _frameName + '" scrolling="no" runat="server" frameborder="no" height="' + iframeHeight + '" width="100%" src="' + modalUrl + '" style="margin:' + _iframePadding + ';padding:0;border:0">You need a Frames Capable browser to view this content.<\/iframe><\/div>';
    
    disableLayer.style.display = "block";
    disableLayer.style.zIndex = _modalZIndex - 1;
    disableLayer.style.position = 'absolute';
    disableLayer.style.top = '-20px';
    disableLayer.style.left = '0px';
    
   
    disableLayer.style.height = ht + 'px';
    disableLayer.style.width = "100%";  // "100%";  //getDockWidth() + 'px';
    disableLayer.style.backgroundColor = _disableBgColor;
    disableLayer.style.visibility = "visible";
    
    try {
        disableLayer.style.opacity = '.6';
    } catch (exc) { }
    try {
        disableLayer.style.filter += ("progid:DXImageTransform.Microsoft.Alpha(opacity=60)");
    } catch(exc) { }
    
    modalObj.style.display = "block";
    modalObj.style.position = "absolute";  //(navigator.userAgent.indexOf('MSIE 6') > -1) ? 'absolute' : 'fixed';
    
    //adjust height for padding...
    modalObj.style.height = modalHeight + "px";
    modalObj.style.width = modalWidth + "px";
    modalObj.style.visibility = "visible";
    modalObj.style.zIndex = _modalZIndex;
    
    _modalWidth = modalWidth;
    _modalHeight = modalHeight;

    calculateWindowDimensions(); 

    var modTop = (_winH - modalHeight) / 2;
    var modLeft = (_winW - modalWidth) / 2;

    modalObj.style.top = modTop + 'px'; //'5%'
    modalObj.style.left = modLeft + 'px';
    
    ht = getDocHeight();
    disableLayer.style.height = ht + 'px';
    return false;    
}


//REF: http: //james.padolsey.com/javascript/get-document-height-cross-browser/
function getDocHeight() {
    var D = document;
    return 20+Math.max(
        Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
        Math.max(D.body.offsetHeight, D.documentElement.offsetHeight),
        Math.max(D.body.clientHeight, D.documentElement.clientHeight)
    );
}

//call in opened page to stop ajax...
function modalOpened() {
    try {
        var modalLoading = getDomObjModal("ajaxLoader");
        if (modalLoading != null) {
            modalLoading.className = "ajaxLoadingComplete";            
        }
    } catch (ex) { }
}


/*DRAG interface
http://www.brainjar.com/dhtml/drag/demo.html
*/

// Determine browser and version.

function Browser() {

    var ua, s, i;

    this.isIE = false;
    this.isNS = false;
    this.version = null;

    ua = navigator.userAgent;

    s = "MSIE";
    if ((i = ua.indexOf(s)) >= 0) {
        this.isIE = true;
        this.version = parseFloat(ua.substr(i + s.length));
        return;
    }

    s = "Netscape6/";
    if ((i = ua.indexOf(s)) >= 0) {
        this.isNS = true;
        this.version = parseFloat(ua.substr(i + s.length));
        return;
    }

    // Treat any other "Gecko" browser as NS 6.1.

    s = "Gecko";
    if ((i = ua.indexOf(s)) >= 0) {
        this.isNS = true;
        this.version = 6.1;
        return;
    }
}

var browser = new Browser();

// Global object to hold drag information.

var dragObj = new Object();
dragObj.zIndex = _modalZIndex+10;

function dragStart(event, id) {

    var el;
    var x, y;

    // If an element id was given, find it. Otherwise use the element being
    // clicked on.

    if (id)
        dragObj.elNode = document.getElementById(id);
    else {
        if (browser.isIE)
            dragObj.elNode = window.event.srcElement;
        if (browser.isNS)
            dragObj.elNode = event.target;

        // If this is a text node, use its parent element.

        if (dragObj.elNode.nodeType == 3)
            dragObj.elNode = dragObj.elNode.parentNode;
    }

    // Get cursor position with respect to the page.

    if (browser.isIE) {
        x = window.event.clientX + document.documentElement.scrollLeft
      + document.body.scrollLeft;
        y = window.event.clientY + document.documentElement.scrollTop
      + document.body.scrollTop;
    }
    if (browser.isNS) {
        x = event.clientX + window.scrollX;
        y = event.clientY + window.scrollY;
    }

    // Save starting positions of cursor and element.

    dragObj.cursorStartX = x;
    dragObj.cursorStartY = y;
    dragObj.elStartLeft = parseInt(dragObj.elNode.style.left, 10);
    dragObj.elStartTop = parseInt(dragObj.elNode.style.top, 10);

    if (isNaN(dragObj.elStartLeft)) dragObj.elStartLeft = 0;
    if (isNaN(dragObj.elStartTop)) dragObj.elStartTop = 0;

    // Update element's z-index.

    dragObj.elNode.style.zIndex = ++dragObj.zIndex;

    // Capture mousemove and mouseup events on the page.

    if (browser.isIE) {
        document.attachEvent("onmousemove", dragGo);
        document.attachEvent("onmouseup", dragStop);
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    }
    if (browser.isNS) {
        document.addEventListener("mousemove", dragGo, true);
        document.addEventListener("mouseup", dragStop, true);
        event.preventDefault();
    }
}

function dragGo(event) {

    var x, y;

    // Get cursor position with respect to the page.

    if (browser.isIE) {
        x = window.event.clientX + document.documentElement.scrollLeft
      + document.body.scrollLeft;
        y = window.event.clientY + document.documentElement.scrollTop
      + document.body.scrollTop;
    }
    if (browser.isNS) {
        x = event.clientX + window.scrollX;
        y = event.clientY + window.scrollY;
    }

    // Move drag element by the same amount the cursor has moved.

    dragObj.elNode.style.left = (dragObj.elStartLeft + x - dragObj.cursorStartX) + "px";
    dragObj.elNode.style.top = (dragObj.elStartTop + y - dragObj.cursorStartY) + "px";

    if (browser.isIE) {
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    }
    if (browser.isNS)
        event.preventDefault();
}

function dragStop(event) {

    // Stop capturing mousemove and mouseup events.

    if (browser.isIE) {
        document.detachEvent("onmousemove", dragGo);
        document.detachEvent("onmouseup", dragStop);
    }
    if (browser.isNS) {
        document.removeEventListener("mousemove", dragGo, true);
        document.removeEventListener("mouseup", dragStop, true);
    }
}

