var _modalLevel = 0;
var _pbForms = new Array();

function GetModalLevel()
{
    return _modalLevel;
}

function GetModalWindow(level)
{
    return top.frames["_modalFrame_" + level];  
}

function GetCurrentModalWindow()
{
    return GetModalWindow(GetModalLevel());
}

function __GetFormElement()
{
    var formElem = top.document.getElementsByTagName("form")[0];
    if (! formElem) alert("No formElem");
    return formElem;
}

// ++ ModalDiv ++

function GetModalDivId(level) { return "_modalDiv_" + level; }

function __GetModalDiv(level)
{
    return top.document.getElementById(GetModalDivId(level));
}

function __GetOrCreateModalDiv()
{
    var modalDiv = __GetModalDiv(_modalLevel);
    if (! modalDiv)
    {
        var id = GetModalDivId(_modalLevel);
        var z = 2000 + 100 * _modalLevel + 1;
    
        var formElem = __GetFormElement();
        
        var tempElem;
        tempElem = top.document.createElement("temp");
        tempElem.innerHTML = "<div id='" + id + "' style='DISPLAY: none; Z-INDEX: " + z + "; VISIBILITY: hidden; POSITION: absolute;'></div>";
        modalDiv = formElem.insertBefore(tempElem.firstChild, formElem.firstChild);
    }
    return modalDiv;
}

// -- ModalDiv --

// ++ ModalTable ++

function __GetModalTableId(level) { return "_modalTable_" + level; }

function __GetModalTable(level)
{
    return top.document.getElementById(__GetModalTableId(level));
}

function __GetOrCreateModalTable()
{
    var modalTable = __GetModalTable(_modalLevel);
    if (! modalTable)
    {
        var id = __GetModalTableId(_modalLevel);
        var z = 2000 + 100 * _modalLevel;

        var formElem = __GetFormElement();
        
        var tempElem;
        tempElem = top.document.createElement("temp");
        //tempElem.innerHTML = "<div id='" + id + "' style='DISPLAY: none; Z-INDEX: " + z + "; VISIBILITY: hidden; POSITION: absolute;'></div>";
        tempElem.innerHTML = "<table id='" + id + "' class='modalOverlayTable' height='100%' width='100%' border='0' style='DISPLAY: none; Z-INDEX: " + z + "; LEFT: 0px; VISIBILITY: hidden; POSITION: absolute; TOP: 0px;'><tr><td>&nbsp;</td></tr></table>";
        modalTable = formElem.insertBefore(tempElem.firstChild, formElem.firstChild);
        //alert("Added modalTable");
    }
    
    return modalTable;
}

// -- ModalTable --



var _resizeEventSet;

function __ShowModal(url, centered, layoutUrl, controlId, version, width, height, cssClass, allowRedirect, hideCloseButton)
{
    //recording current form action in the array for later reference if opening modal from another frame (not modal frame)
    var str = document.forms[0].action;
    if(str.indexOf("ModalWindow.axd") < 0)
    {
        top._pbForms[_modalLevel] = document.forms[0].action;
    }
    else
    {
        top._pbForms[_modalLevel] = null;
    }
    
    top.__TopShowModal(url, centered, layoutUrl, controlId, version, width, height, cssClass, allowRedirect, hideCloseButton);
}

function __TopShowModal(url, centered, layoutUrl, controlId, version, width, height, cssClass, allowRedirect, hideCloseButton)
{
    _modalLevel++;

    /*
    LogReportMonitor("modal", "Entered __ShowModal()\n" +
                              "\t\tlevel=" + _modalLevel + "\n" +
                              GetWindowInfo(top, "\t\t") +
                              "");
    */
    
    var dragger = document.getElementById("_dragger");
    if(dragger == null)
    {
        var formElem = __GetFormElement();
        var tempElem;
        tempElem = top.document.createElement("temp");
        tempElem.innerHTML = "<table id=\"_dragger\" class=dragger border=0 style=\"DISPLAY: none; VISIBILITY: hidden; POSITION: absolute;\"><tr><td>&nbsp;</td></tr></table>";
        modalTable = formElem.insertBefore(tempElem.firstChild, formElem.firstChild);
    }
    
    var child = __GetModalControl(url, layoutUrl, version, width, height, cssClass, allowRedirect, hideCloseButton);
    
    if(_resizeEventSet != true)
    {
        //setting up event handling to keep modal and cover table in place
        RegisterHandler(window, "resize", new Function("__OnWindowResize();"), false);
        _resizeEventSet = true;
    }
    
    if(child != null)
    {
        var modalTable = __GetOrCreateModalTable();
        var modalDiv = __GetOrCreateModalDiv();
        
        // var isIE = control.childNodes.item ? true : false;
        
        modalTable.style.display = 'block';
        modalTable.style.visibility = '';
        modalTable.style.height = top.document.body.scrollHeight * 1;// + document.body.topMargin * 1 + document.body.bottomMargin * 1;
        modalTable.style.width = top.document.body.scrollWidth * 1;// + document.body.leftMargin * 1 + document.body.rightMargin * 1;
        
        modalDiv.style.display = 'block';
        modalDiv.setAttribute("controlId", controlId);

        modalDiv.setAttribute("centered", centered);
        modalDiv.setAttribute("alreadycentered", false);
        if(modalDiv.childNodes.length > 0) // if there are left overs remove them
        {
            //alert("Cleaning up " + modalDiv.childNodes.length + " leftovers\n" + 
            //      "1st leftover = " + GetTagForElement(modalDiv.childNodes[0]));
                  
            var isIE = modalDiv.childNodes.item ? true : false;
            for(i=0; i < modalDiv.childNodes.length; i++)
            {
                var childElement = isIE ? modalDiv.childNodes.item(0) : modalDiv.childNodes[i];
                modalDiv.removeChild(childElement);
            }
        }
        
        // Add the elements of the modal layout to the modal div.
        for (i=0; i< child.childNodes.length; i++)
            modalDiv.appendChild(child.childNodes[i]);
        
        window.setTimeout("__ShowModalWindow();", 100);
        
        //AlertStackingContexts("In __ShowModal()");
    }
    
    //alert("Leaving __ShowModal()");

}

function __ShowModalWindow()
{
    //LogReportMonitor("modal", "Entered __ShowModalWindow()\n" + "\t\tmodalLevel = " + _modalLevel);
    
    var level = _modalLevel;
    var modalDiv = __GetModalDiv(level);
    
    HideActiveContentForElement(modalDiv);
        
    modalDiv.style.height="";
    modalDiv.style.visibility = '';
    var centered = modalDiv.getAttribute("centered");
    if(centered)
    {
        modalDiv.style.top = (GetWindowHeight() / 2) - (modalDiv.offsetHeight / 2);
        modalDiv.style.left = (GetWindowWidth() / 2) - (modalDiv.offsetWidth  / 2);
    }
    modalDiv.style.visibility = "";

    //LogReportMonitor("modal", "Leaving __ShowModalWindow()");
}
function __OnWindowResize()
{
    var level = _modalLevel;
    var modalTable = __GetModalTable(level);
    if(modalTable == null)
    {
        return;
    }
    var modalDiv = __GetModalDiv(level);
    
    modalTable.style.height = top.document.body.scrollHeight * 1;// + document.body.topMargin * 1 + document.body.bottomMargin * 1;
    modalTable.style.width = top.document.body.scrollWidth * 1;// + document.body.leftMargin * 1 + document.body.rightMargin * 1;
    
    var centered = modalDiv.getAttribute("centered");
    if(centered)
    {
        modalDiv.style.top = (GetWindowHeight() / 2) - (modalDiv.offsetHeight / 2);
        modalDiv.style.left = (GetWindowWidth() / 2) - (modalDiv.offsetWidth  / 2);
    }

    UpdateShim(modalDiv);
}

function __DismissModal(stateKey)
{
   // LogReportMonitor("modal", "Entered __DismissModal()");
   
    //top.document.selection.empty();

    if(stateKey == null) stateKey = '';
    //executing with small delay to prevent firefox crashing
    window.setTimeout("top.__DismissModalDelayed('" + stateKey + "');", 50);
    //__DismissModalDelayed(stateKey);
}

function __DismissModalDelayed(stateKey)
{
    var modalLevelDismissed = _modalLevel;

    var modalTable = __GetOrCreateModalTable();
    var modalDiv = __GetOrCreateModalDiv();

    /*
    LogReportMonitor("modal", "Entered __DismissModalDelayed()\n" +
                              "\t\tlevel=" + modalLevelDismissed + "\n" +
                              "\t\tmodalTable=|" + GetTagForElement(modalTable) + "|\n" +
                              "\t\tmodalDiv=|" + GetTagForElement(modalDiv) + "|" +
                              "");
    */
    
    var controlId = modalDiv.getAttribute("controlId");
    
    modalTable.style.visibility = "hidden";
    modalTable.style.display = "none";
    
    modalDiv.style.visibility = "hidden";
    modalDiv.style.display = "none";

    UnHideActiveContentForElement(modalDiv);
    
    var submitFrame = null;
    
    
    var submitLevel = _modalLevel - 1;
    _modalLevel--;
    
    var submitAction = null;
    //let's see if modal was opened from another frame
    if(_pbForms.length > _modalLevel)
        submitAction = _pbForms[_modalLevel];
    
    if(submitAction != null)
    {
        for(var frameIndex = 0; frameIndex < frames.length; frameIndex++)
        {
            var frameAction = frames[frameIndex].document.forms[0].action;
            
            if(frameAction == submitAction)
            {
                _pbForms[_modalLevel] = null;
                //if it was submit that frame
                submitFrame = frames[frameIndex];
                submitFrame.focus();
                submitFrame.__doPostBack(null, controlId, stateKey);
            }
        }
    }
    //otherwise perform as it was before
    if(submitFrame == null)
    {
        if(submitLevel > 0)
        {
            var frameName = "_modalFrame_" + submitLevel;
            if(GetIsIE())
            {
                submitFrame = frames[frameName];
            }
            else
            {
                for(var frameIndex1 = 0; frameIndex1 < frames.length; frameIndex1++)
                {
                    if(frames[frameIndex1].name = frameName)
                    {
                        submitFrame = frames[frameIndex1];
                        break;
                    }
                }
            }
            submitFrame.focus();
            submitFrame.__doPostBack(null, controlId, stateKey);
        }
        else
        {
            if(_resizeEventSet)
            {
                UnregisterHandler(window, "resize", new Function("__OnWindowResize();"), false);
                _resizeEventSet = false;
            }
            window.focus();
            __doPostBack(null, controlId, stateKey);
        }
    }
    //Firefox getting fatal error in IFRAME if IFRAME is removed during this code.
    //We will remove it in 500 ms. 
    //do not remove controls at all. We will remove them when we create new modal
    //window.setTimeout("__RemoveWindow(" + modalLevelDismissed + ");", 100);
    
    //modalFrame.src = 'about:blank';
    
    //LogReportMonitor("modal", "Leaving __DismissModalDelayed()\n" + GetWindowInfo(top, "\t\t"));
}


function __GetModalControl(url, layoutUrl, version, width, height, cssClass, allowRedirect, hideCloseButton)
{
    //LogReportMonitor("modal", "Entered __GetModalControl()");
    
    var html = ExecServerRequest(layoutUrl + "?.ver=" + version);
    if(html == null)
    {
        html = new String();
        html += "<table cellpadding=0 cellspacing=0 border=1>";
        html += "    <tr style='background-color:Silver;height:20px'>";
        html += "        <td id='_modalTitle_@@'>Blank</td>";
        html += "    </tr>";
        html += "    <tr>";
        html += "        <td>";
        html += "            <iframe style='background-color:#ffffff;' id='_modalFrame_@@' name='_modalFrame_@@' src='" + url + "&.modal=true' frameborder=0 scrolling=no />";
        html += "        </td>";
        html += "    </tr>";
        html += "</table>";
    }
    
    var iframe = "";
    iframe += "<iframe";
    iframe += " class=\"ModalFrame\"";
    iframe += " id=\"_modalFrame_@@\"";
    iframe += " name=\"_modalFrame_@@\"";
    iframe += " frameborder='0'";
    iframe += " scrolling='no'";
    iframe += " style='visibility:hidden;'";
    iframe += " onload='__OnFrameLoaded();'";
    if(width > 0)
        iframe += " width=" + width;
    if(height > 0)
        iframe += " height=" + height;
    iframe +=   " src='" + url + "&.modal=" + _modalLevel + "&.redir=" + allowRedirect;
    if(width > 0)
        iframe += "&.mw=" + width;
    if(height > 0)
        iframe += "&.mh=" + height;
    iframe += "'>";
    iframe += "</iframe>";

    html = html.replace(/@CONTENT@/g, iframe);
    html = html.replace(/@CssClass@/g, cssClass);
    if(hideCloseButton)
        html = html.replace(/@HIDECLOSE@/g, "MDLHIDECLOSE");
    html = html.replace(/@@/g, _modalLevel);
    //alert("html=|" + html + "|");
    
    var tempElem;
    tempElem = top.document.createElement("temp");
    tempElem.innerHTML = html;
    //alert("innerHTML=|" + tempElem.innerHTML + "|");

    //LogReportMonitor("modal", "Leaving __GetModalControl()");
    
    return tempElem;
}

function __ModalOnLoad(level, width, height, title)
{
    //LogReportMonitor("modal", "Entered __ModalOnLoad()");
    //console.olg
    var w = frames["_modalFrame_" + level];
    if(w == null)
    {
        window.setTimeout("__ModalOnLoad(" + level + "," + width + "," + height + ",'" + title + "');", 50);
        return;
    }
    
    
    //w.focus(); 
    //LogReportMonitor("modal", "focused window for level " + level);

    var f = top.document.getElementById("_modalFrame_" + level);
    var fw = f.getAttribute("width");
    if(fw != null) fw *= 1;
    var fh = f.getAttribute("height");
    if(fh != null) fh *= 1;
    
    //alert("w=|" + w+ "| f=|" + f + "| fw=|" + fw + "| fh=|" + fh + "|  width=|" + width + "|  height=|" + height + "|");
    
    if(fw == null || fw == 0 || fw < width)
        f.width = width;
        
    if(fh == null || fh == 0 || fh != height)
        f.height = height;
    
    var t = top.document.getElementById("_modalTitle_" + level);
    if(title == '') title = "&nbsp;";
    if(t != null)
        t.innerHTML = title;

    var modalDiv = __GetModalDiv(level);
    modalDiv.style.overflow = "visible";

    var alreadycentered = modalDiv.getAttribute("alreadycentered");
    if(alreadycentered != true)
    {
        var centered = modalDiv.getAttribute("centered");
        if(centered)
        {
            modalDiv.style.top = (GetWindowHeight() / 2) - (modalDiv.offsetHeight / 2);
            modalDiv.style.left = (GetWindowWidth() / 2) - (modalDiv.offsetWidth  / 2);
            modalDiv.setAttribute("alreadycentered", true);
        }
        
        //let's set focus on first text box or any other type of input control
        /*
        var frameForm = w.document.forms[0];
        
        var found = false;
        for (var frameElementIndex = 0; frameElementIndex < frameForm.elements.length; frameElementIndex++) 
        {
            var field = frameForm.elements[frameElementIndex];
            if (field.name) 
            {
                var fType = field.type.toLowerCase();
                switch(fType)
                {
                    case "text":
                    case "textarea":
                    case "password":
                    case "file":
                    case "checkbox":
                    case "radio":
                    case "select-one":
                    case "select-multiple":
                    try
                    {
                        field.focus();
                        found = true;
                    }
                    catch(focusError)
                    {
                        //if there was an error continue to the next field
                    }
                    break;
                }
            } 
            if(found) break;
        }
        */
    }
    UpdateShim(modalDiv);
    //LogReportMonitor("modal", "Leaving __ModalOnLoad()");
}

function __ModalLoaded(level, withFocus)
{
    //LogReportMonitor("modal", "Entered __ModalLoaded(" + level + ")\n\t\twindow=|" + window + "|");
    
    var t = document.getElementById("_modalPage");
    var width = t.offsetWidth;
    var height = t.offsetHeight;
    if(width == 0 && height == 0)
    {
        //try again
        window.setTimeout("__ModalLoaded(" + level + ");", 100);
        return;
    }
    var title = document.title;
    //alert(title + " w=" + width + " h=" + height);
    parent.__ModalOnLoad(level, width, height, title);
}

function __OnFrameLoaded()
{
    //LogReportMonitor("modal", "Entered __OnFrameLoaded()");
    
    var level = _modalLevel;

    var frame = frames["_modalFrame_" + level];
    if(frame == null)
    {
        window.setTimeout("__OnFrameLoaded", 50);
        return;
    }
    
    var frameElement = top.document.getElementById("_modalFrame_" + level);
    if(frameElement == null)
    {
        window.setTimeout("__OnFrameLoaded", 50);
        return;
    }
    frameElement.style.visibility="visible";

    var doc = frameElement.contentDocument;         // W3C 
    if (! doc) doc = frame.document;                // IE
    
    if (!doc) 
    {
        alert("__OnFrameLoaded():  no document for frame at level " + level + ".  frame=" + GetTagForElement(frame));
        return;
    }
    
    if(doc.location.href.indexOf(".modal=") < 0)
    {
        top.document.location = doc.location;
    }
    else 
    {
        var testHtml = doc.documentElement.innerHTML.substring(0, 500);
        if(testHtml.indexOf("<!-- ERROR PAGE -->") > 0)
        {
            var f = top.document.getElementById("_modalFrame_" + level);
            f.scrolling = "yes";
            f.width = 700;
            f.height = 500;
            
            var modalDiv = __GetModalDiv(level);
            modalDiv.style.top = (GetWindowHeight() / 2) - (modalDiv.offsetHeight / 2);
            modalDiv.style.left = (GetWindowWidth() / 2) - (modalDiv.offsetWidth  / 2);
            
            var t = top.document.getElementById("_modalTitle_" + level);
            if(t != null)
            {
                t.innerHTML = frame.document.title;
            }
        }
        
    }

    //LogReportMonitor("modal", "Leaving __OnFrameLoaded()\n" + GetWindowInfo(top, "\t\t"));

}