//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;

        // Asseco old code START
        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');
        // Asseco old code START

        sMaxFile = sMaxIcon.toLowerCase().substr(sMaxIcon.lastIndexOf('/'));

        var iNum = 5;
        if (oLnk.getAttribute('animf') != null)
            iNum = new Number(oLnk.getAttribute('animf'));

        if (sCurrentFile == sMaxFile) {
            // Asseco old code START
            oBtn.src = sMinIcon;
            // Asseco old code STOP
            //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 {
            // Asseco old code START
            oBtn.src = sMaxIcon;
            // Asseco old code STOP
            //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) {
        // Asseco old code START
        //var sMaxIcon = oBtn.getAttribute('max_icon');
        //var sMinIcon = oBtn.getAttribute('min_icon');
        // Asseco old code STOP

        // Asseco START
        var sMaxIcon = '';
        var sMinIcon = '';
        if (oBtn.getAttribute('min_icon'))
            sMinIcon = oBtn.getAttribute('min_icon');
        else if (dnn.getVar('min_icon_' + sContentID))
            sMinIcon = dnn.getVar('min_icon_' + sContentID);
        else if (dnn.getVar('min_icon'))
            sMinIcon = dnn.getVar('min_icon');
        else
            // toto sposobovalo nezobrazenie ikony, ak sme mali "root" portal
            //sMinIcon = "/" + document.location.pathname.split("/")[1] + "/images/minus.gif";
            sMinIcon = "/images/minus.gif";

        if (oBtn.getAttribute('max_icon'))
            sMaxIcon = oBtn.getAttribute('max_icon');
        else if (dnn.getVar('max_icon_' + sContentID))
            sMaxIcon = dnn.getVar('max_icon_' + sContentID);
        else if (dnn.getVar('max_icon'))
            sMaxIcon = dnn.getVar('max_icon');
        else
            // toto sposobovalo nezobrazenie ikony, ak sme mali "root" portal
            //sMaxIcon = "/" + document.location.pathname.split("/")[1] + "/images/plus.gif";
            sMaxIcon = "/images/plus.gif";
        // Asseco STOP


        var bCallback = oBtn.getAttribute('userctr') != null;
        var sVal;
        if (oContent.style.display == 'none') {
            // Asseco old code START
            oBtn.src = sMinIcon;
            // Asseco old code STOP
            oContent.style.display = '';
            if (bCallback)
                sVal = 'True';
            else
                dnn.setVar(oBtn.id + ':exp', 1);
        }
        else {
            // Asseco old code START
            oBtn.src = sMaxIcon;
            // Asseco old code STOP
            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();
