//General
//for example: instead of each module writing out script found in moduleMaxMin_OnClick have the functionality cached
//

var DNN_COL_DELIMITER = String.fromCharCode(16);
var DNN_ROW_DELIMITER = String.fromCharCode(15);
var __dnn_m_bPageLoaded = false;

window.onload = __dnn_Page_OnLoad;

function __dnn_ClientAPIEnabled()
{
        return typeof(dnn) != 'undefined';
}


function __dnn_Page_OnLoad()
{
        if (__dnn_ClientAPIEnabled())
        {
                var sLoadHandlers = dnn.getVar('__dnn_pageload');
                if (sLoadHandlers != null)
                        eval(sLoadHandlers);

                dnn.dom.attachEvent(window, 'onscroll', __dnn_bodyscroll);
        }
        __dnn_m_bPageLoaded = true;
}

function __dnn_KeyDown(iKeyCode, sFunc, e)
{
        if (e == null)
                e = window.event;

        if (e.keyCode == iKeyCode)
        {
                eval(unescape(sFunc));
                return false;
        }
}

function __dnn_bodyscroll()
{
        var oF=document.forms[0];
        if (__dnn_ClientAPIEnabled() && __dnn_m_bPageLoaded)
                oF.ScrollTop.value=document.documentElement.scrollTop ? document.documentElement.scrollTop : dnn.dom.getByTagName("body")[0].scrollTop;
}

function __dnn_setScrollTop(iTop)
{
        if (__dnn_ClientAPIEnabled())
        {
                if (iTop == null)
                        iTop = document.forms[0].ScrollTop.value;

                var sID = dnn.getVar('ScrollToControl');
                if (sID != null && sID.length > 0)
                {
                        var oCtl = dnn.dom.getById(sID);
                        if (oCtl != null)
                        {
                                iTop = dnn.dom.positioning.elementTop(oCtl);
                                dnn.setVar('ScrollToControl', '');
                        }
                }
                window.scrollTo(0, iTop);
        }
}

//Focus logic
function __dnn_SetInitialFocus(sID)
{
//        var oCtl = dnn.dom.getById(sID);
//        if (oCtl != null && __dnn_CanReceiveFocus(oCtl))
//                oCtl.focus();
}

function __dnn_CanReceiveFocus(e)
{
        //probably should call getComputedStyle for classes that cause item to be hidden
        if (e.style.display != 'none' && e.tabIndex > -1 && e.disabled == false && e.style.visible != 'hidden')
        {
                var eParent = e.parentElement;
                while (eParent != null && eParent.tagName != 'BODY')
                {
                        if (eParent.style.display == 'none' || eParent.disabled || eParent.style.visible == 'hidden')
                                return false;
                        eParent = eParent.parentElement;
                }
                return true;
        }
        else
                return false;
}

//Max/Min Script
function __dnn_ContainerMaxMin_OnClick(oLnk, sContentID)
{
        var oContent = dnn.dom.getById(sContentID);
        if (oContent != null)
        {
                var oBtn = oLnk.childNodes[0];
                var sContainerID = oLnk.getAttribute('containerid');
                var sCookieID = oLnk.getAttribute('cookieid');
                var sCurrentFile = oBtn.src.toLowerCase().substr(oBtn.src.lastIndexOf('/'));
                var sMaxFile;
                var sMaxIcon;
                var sMinIcon;

                if (dnn.getVar('min_icon_' + sContainerID))
                        sMinIcon = dnn.getVar('min_icon_' + sContainerID);
                else
                        sMinIcon = dnn.getVar('min_icon');

                if (dnn.getVar('max_icon_' + sContainerID))
                        sMaxIcon = dnn.getVar('max_icon_' + sContainerID);
                else
                        sMaxIcon = dnn.getVar('max_icon');

                sMaxFile = sMaxIcon.toLowerCase().substr(sMaxIcon.lastIndexOf('/'));

                var iNum = 5;
                if (oLnk.getAttribute('animf') != null)
                        iNum = new Number(oLnk.getAttribute('animf'));

                if (sCurrentFile == sMaxFile)
                {
                        oBtn.src = sMinIcon;
                        //oContent.style.display = '';
                        dnn.dom.expandElement(oContent, iNum);
                        oBtn.title = dnn.getVar('min_text');
                        if (sCookieID != null)
                        {
                                if (dnn.getVar('__dnn_' + sContainerID + ':defminimized') == 'true')
                                        dnn.dom.setCookie(sCookieID, 'true', 365);
                                else
                                        dnn.dom.deleteCookie(sCookieID);
                        }
                        else
                                dnn.setVar('__dnn_' + sContainerID + '_Visible', 'true');
                }
                else
                {
                        oBtn.src = sMaxIcon;
                        //oContent.style.display = 'none';
                        dnn.dom.collapseElement(oContent, iNum);
                        oBtn.title = dnn.getVar('max_text');
                        if (sCookieID != null)
                        {
                                if (dnn.getVar('__dnn_' + sContainerID + ':defminimized') == 'true')
                                        dnn.dom.deleteCookie(sCookieID);
                                else
                                        dnn.dom.setCookie(sCookieID, 'false', 365);
                        }
                        else
                                dnn.setVar('__dnn_' + sContainerID + '_Visible', 'false');
                }

                return true;        //cancel postback
        }
        return false;        //failed so do postback
}

function __dnn_Help_OnClick(sHelpID)
{
        var oHelp = dnn.dom.getById(sHelpID);
        if (oHelp != null)
        {
                if (oHelp.style.display == 'none')
                        oHelp.style.display = '';
                else
                        oHelp.style.display = 'none';

                return true;        //cancel postback
        }
        return false;        //failed so do postback
}

function __dnn_SectionMaxMin(oBtn, sContentID)
{
        var oContent = dnn.dom.getById(sContentID);
        if (oContent != null)
        {
                var sMaxIcon = oBtn.getAttribute('max_icon');
                var sMinIcon = oBtn.getAttribute('min_icon');
                var bCallback = oBtn.getAttribute('userctr') != null;
                var sVal;
                if (oContent.style.display == 'none')
                {
                        oBtn.src = sMinIcon;
                        oContent.style.display = '';
                        if (bCallback)
                            sVal = 'True';
                        else
                            dnn.setVar(oBtn.id + ':exp', 1);
                }
                else
                {
                        oBtn.src = sMaxIcon;
                        oContent.style.display = 'none';
                        if (bCallback)
                            sVal = 'False';
                        else
                dnn.setVar(oBtn.id + ':exp', 0);
                }
                if (bCallback)
                    dnncore.setUserProp(oBtn.getAttribute('userctr'), oBtn.getAttribute('userkey'), sVal, null);
                return true;        //cancel postback
        }
        return false;        //failed so do postback
}

//Drag N Drop
function __dnn_enableDragDrop()
{
        var aryConts = dnn.getVar('__dnn_dragDrop').split(";");
        var aryTitles;

        for (var i=0; i < aryConts.length; i++)
        {
                aryTitles = aryConts[i].split(" ");
                if (aryTitles[0].length > 0)
                {
                        var oCtr = dnn.dom.getById(aryTitles[0]);
                        var oTitle = dnn.dom.getById(aryTitles[1]);
                        if (oCtr != null && oTitle != null)
                        {
                                oCtr.setAttribute('moduleid', aryTitles[2]);
                                dnn.dom.positioning.enableDragAndDrop(oCtr, oTitle, '__dnn_dragComplete()', '__dnn_dragOver()');
                        }
                }
        }
}

var __dnn_oPrevSelPane;
var __dnn_oPrevSelModule;
var __dnn_dragEventCount=0;
function __dnn_dragOver()
{
        __dnn_dragEventCount++;
        if (__dnn_dragEventCount % 75 != 0)        //only calculate position every 75 events
                return;

        var oCont = dnn.dom.getById(dnn.dom.positioning.dragCtr.contID);

        var oPane = __dnn_getMostSelectedPane(dnn.dom.positioning.dragCtr);

        if (__dnn_oPrevSelPane != null)        //reset previous pane's border
                __dnn_oPrevSelPane.pane.style.border = __dnn_oPrevSelPane.origBorder;

        if (oPane != null)
        {
                __dnn_oPrevSelPane = oPane;
                oPane.pane.style.border = '4px double ' + DNN_HIGHLIGHT_COLOR;
                var iIndex = __dnn_getPaneControlIndex(oCont, oPane);

                var oPrevCtl;
                var oNextCtl;
                for (var i=0; i<oPane.controls.length; i++)
                {
                        if (iIndex > i && oPane.controls[i].id != oCont.id)
                                oPrevCtl = oPane.controls[i];
                        if (iIndex <= i && oPane.controls[i].id != oCont.id)
                        {
                                oNextCtl = oPane.controls[i];
                                break;
                        }
                }

                if (__dnn_oPrevSelModule != null)
                        dnn.dom.getNonTextNode(__dnn_oPrevSelModule.control).style.border = __dnn_oPrevSelModule.origBorder;


                if (oNextCtl != null)
                {
                        __dnn_oPrevSelModule = oNextCtl;
                        dnn.dom.getNonTextNode(oNextCtl.control).style.borderTop = '5px groove ' + DNN_HIGHLIGHT_COLOR;
                }
                else if (oPrevCtl != null)
                {
                        __dnn_oPrevSelModule = oPrevCtl;
                        dnn.dom.getNonTextNode(oPrevCtl.control).style.borderBottom = '5px groove ' + DNN_HIGHLIGHT_COLOR;
                }
        }
}

function __dnn_dragComplete()
{
        var oCtl = dnn.dom.getById(dnn.dom.positioning.dragCtr.contID);
        var sModuleID = oCtl.getAttribute('moduleid');

        if (__dnn_oPrevSelPane != null)
                __dnn_oPrevSelPane.pane.style.border = __dnn_oPrevSelPane.origBorder;

        if (__dnn_oPrevSelModule != null)
                dnn.dom.getNonTextNode(__dnn_oPrevSelModule.control).style.border = __dnn_oPrevSelModule.origBorder;

        var oPane = __dnn_getMostSelectedPane(dnn.dom.positioning.dragCtr);
        var iIndex;
        if (oPane == null)
        {
                var oPanes = __dnn_Panes();
                for (var i=0; i<oPanes.length; i++)
                {
                        if (oPanes[i].id == oCtl.parentNode.id)
                                oPane = oPanes[i];
                }
        }
        if (oPane != null)
        {
                iIndex = __dnn_getPaneControlIndex(oCtl, oPane);
                __dnn_MoveToPane(oPane, oCtl, iIndex);

                dnn.callPostBack('MoveToPane', 'moduleid=' + sModuleID, 'pane=' + oPane.paneName, 'order=' + iIndex * 2);
        }
}

function __dnn_MoveToPane(oPane, oCtl, iIndex)
{

        if (oPane != null)
        {
                var aryCtls = new Array();
                for (var i=iIndex; i<oPane.controls.length; i++)
                {
                        if (oPane.controls[i].control.id != oCtl.id)
                                aryCtls[aryCtls.length] = oPane.controls[i].control;

                        dnn.dom.removeChild(oPane.controls[i].control);
                }
                dnn.dom.appendChild(oPane.pane, oCtl);
                oCtl.style.top=0;
                oCtl.style.left=0;
                oCtl.style.position = 'relative';
                for (var i=0; i<aryCtls.length; i++)
                {
                        dnn.dom.appendChild(oPane.pane, aryCtls[i]);
                }
                __dnn_RefreshPanes();
        }
        else
        {
                oCtl.style.top=0;
                oCtl.style.left=0;
                oCtl.style.position = 'relative';
        }
}

function __dnn_RefreshPanes()
{
        var aryPanes = dnn.getVar('__dnn_Panes').split(';');
        var aryPaneNames = dnn.getVar('__dnn_PaneNames').split(';');
        __dnn_m_aryPanes = new Array();
        for (var i=0; i<aryPanes.length; i++)
        {
                if (aryPanes[i].length > 0)
                        __dnn_m_aryPanes[__dnn_m_aryPanes.length] = new __dnn_Pane(dnn.dom.getById(aryPanes[i]), aryPaneNames[i]);
        }
}

var __dnn_m_aryPanes;
var __dnn_m_aryModules;
function __dnn_Panes()
{
        if (__dnn_m_aryPanes == null)
        {
                __dnn_m_aryPanes = new Array();
                __dnn_RefreshPanes();
        }
        return __dnn_m_aryPanes;
}

function __dnn_Modules(sModuleID)
{
        if (__dnn_m_aryModules == null)
                __dnn_RefreshPanes();

        return __dnn_m_aryModules[sModuleID];
}

function __dnn_getMostSelectedPane(oContent)
{
        var oCDims = new dnn.dom.positioning.dims(oContent);
        var iTopScore=0;
        var iScore;
        var oTopPane;
        for (var i=0; i<__dnn_Panes().length; i++)
        {
                var oPane = __dnn_Panes()[i];
                var oPDims = new dnn.dom.positioning.dims(oPane.pane);
                iScore = dnn.dom.positioning.elementOverlapScore(oPDims, oCDims);

                if (iScore > iTopScore)
                {
                        iTopScore = iScore;
                        oTopPane = oPane;
                }
        }
        return oTopPane;
}

function __dnn_getPaneControlIndex(oContent, oPane)
{
        if (oPane == null)
                return;
        var oCDims = new dnn.dom.positioning.dims(oContent);
        var oCtl;
        if (oPane.controls.length == 0)
                return 0;
        for (var i=0; i<oPane.controls.length; i++)
        {
                oCtl = oPane.controls[i];
                var oIDims = new dnn.dom.positioning.dims(oCtl.control);
                if (oCDims.t < oIDims.t)
                        return oCtl.index;
        }
        if (oCtl != null)
                return oCtl.index+1;
        else
                return 0;
}

//Objects
function __dnn_Pane(ctl, sPaneName)
{
        this.pane = ctl;
        this.id = ctl.id;
        this.controls = new Array();
        this.origBorder = ctl.style.border;
        this.paneName = sPaneName;

        var iIndex = 0;
        var strModuleOrder='';
        for (var i=0; i<ctl.childNodes.length; i++)
        {
                var oNode = ctl.childNodes[i];
                if (dnn.dom.isNonTextNode(oNode))
                {
                        if (__dnn_m_aryModules == null)
                                __dnn_m_aryModules = new Array();

                        //if (oNode.tagName == 'A' && oNode.childNodes.length > 0)
                        //        oNode = oNode.childNodes[0];        //DNN now embeds anchor tag

                        var sModuleID = oNode.getAttribute('moduleid');
                        if (sModuleID != null && sModuleID.length > 0)
                        {
                                strModuleOrder += sModuleID + '~';
                                this.controls[this.controls.length] = new __dnn_PaneControl(oNode, iIndex);
                                __dnn_m_aryModules[sModuleID] = oNode.id;
                                iIndex+=1;
                        }
                }
        }
        this.moduleOrder = strModuleOrder;

}

function __dnn_PaneControl(ctl, iIndex)
{
        this.control = ctl;
        this.id = ctl.id;
        this.index = iIndex;
        this.origBorder = ctl.style.border;

}

//move towards dnncore ns.  right now only for personalization
function __dnncore()
{
    this.GetUserVal = 0;
    this.SetUserVal = 1;
}

__dnncore.prototype = {
getUserProp: function(sNameCtr, sKey, pFunc) {
    this._doUserCallBack(dnncore.GetUserVal, sNameCtr, sKey, null, new dnncore.UserPropArgs(sNameCtr, sKey, pFunc));
},

setUserProp: function(sNameCtr, sKey, sVal, pFunc) {
    this._doUserCallBack(dnncore.SetUserVal, sNameCtr, sKey, sVal, new dnncore.UserPropArgs(sNameCtr, sKey, pFunc));
},

_doUserCallBack: function(iType, sNameCtr, sKey, sVal, pFunc) {
    if (dnn && dnn.xmlhttp)
    {
        var sPack = iType + COL_DELIMITER + sNameCtr + COL_DELIMITER + sKey + COL_DELIMITER + sVal;
        dnn.xmlhttp.doCallBack('__Page',sPack,dnncore._callBackSuccess,pFunc,dnncore._callBackFail,null,true,null,0);
    }
    else
        alert('Client Personalization not enabled');
},

_callBackSuccess: function (result, ctx, req) {
    if (ctx.pFunc)
        ctx.pFunc(ctx.namingCtr, ctx.key, result);
},

_callBackFail: function (result, ctx) {
        window.status = result;
}
}

__dnncore.prototype.UserPropArgs = function(sNameCtr, sKey, pFunc)
{
    this.namingCtr = sNameCtr;
        this.key = sKey;
        this.pFunc = pFunc;
}

var dnncore = new __dnncore();