// To do:
// Farm out positioning to style-specific functions
// Rewrite event handlers in index.php to use global CoN functions
// Mechanism to allow a dropdown to be open initially

var openDropdown = null;
var activeDropdownOwner = null;

function unfocusDropdowns () {
    if (activeDropdownOwner) {
        setDropdownOwnerInactive(activeDropdownOwner);
    }
    activeDropdownOwner = null;
    if (openDropdown) {
        setDropdownHidden(openDropdown);
    }
    openDropdown = null;
    return true;
}

function focusDropdown (dropDownID, owner, evt) {
    var dropDownElem = document.getElementById(dropDownID);
    if (dropDownElem == openDropdown) {
        unfocusDropdowns();
        return false;
    }
    unfocusDropdowns();
    if (!dropDownElem) {
        return true;
    }
    openDropdown = dropDownElem;
    activeDropdownOwner = owner;
    positionDropdowns();
    setDropdownOwnerActive(activeDropdownOwner);
    dropDownFocusElem = document.getElementById(dropDownID + '-focalpoint');
    if (!dropDownFocusElem) {
        dropDownFocusElem = dropDownElem;
    }
    owner.blur();
    dropDownFocusElem.focus();
    preventBubble(evt);
    return false;
}

function preventBubble (evt) {
	if (!evt) var evt = window.event;
	evt.cancelBubble = true;
	if (evt.stopPropagation) evt.stopPropagation();
    return true;
}

function closeDropdownsOnEsc (evt) {
    if (!evt) var evt = window.event;
    if (evt.keyCode == 27) { // ESC
        var oldDropdownActivator = activeDropdownOwner;
        unfocusDropdowns();
        if (oldDropdownActivator) {
            oldDropdownActivator.focus();
        }
    }
    preventBubble(evt);
    return true;
}

function positionDropdowns () {
    if (!openDropdown) {
        return true;
    }
    var relativeAncestor = findRelativeAncestor(activeDropdownOwner);
    var containerWidth = relativeAncestor ? relativeAncestor.offsetWidth : document.body.clientWidth;
    var dropdownOwnerOffsetTop = findPosY(activeDropdownOwner, relativeAncestor);
    var dropdownOwnerOffsetLeft = findPosX(activeDropdownOwner, relativeAncestor);
    setDropdownVisible(openDropdown);
    var dropdownOwnerOffsetRight = dropdownOwnerOffsetLeft + activeDropdownOwner.offsetWidth;
    var dropdownOwnerOffsetBottom = dropdownOwnerOffsetTop + activeDropdownOwner.offsetHeight;
    var posFromRight = (containerWidth - dropdownOwnerOffsetRight);
    openDropdown.style.top   = (dropdownOwnerOffsetBottom - 1) + 'px';
    openDropdown.style.right = posFromRight + 'px';
    return true;
}

function setDropdownVisible (obj) {
    if (obj.className == "dropdown-hidden") {
        obj.className = "dropdown-visible";
    } else if (obj.className.indexOf("dropdown-visible") == -1 && obj.className.indexOf("dropdown-hidden") != -1) {
        obj.className += " dropdown-visible";
        obj.className = obj.className.replace(/ dropdown-hidden/,"");
    }
    return true;
}

function setDropdownHidden (obj) {
    if (obj.className == "dropdown-visible") {
        obj.className = "dropdown-hidden";
    } else if (obj.className.indexOf("dropdown-visible") != -1 && obj.className.indexOf("dropdown-hidden") == -1) {
        obj.className += " dropdown-hidden";
        obj.className = obj.className.replace(/ dropdown-visible/,"");
    }
    return true;
}

function setDropdownOwnerActive (obj) {
    if (obj.className.indexOf("dropdown-section-open") == -1) {
        obj.className += " dropdown-section-open";
    }
    return true;
}

function setDropdownOwnerInactive (obj) {
    obj.className = obj.className.replace(/ dropdown-section-open/,"");
    return true;
}

function getStyle (obj, styleProp) {
    if (obj.currentStyle)
        var y = obj.currentStyle[styleProp];
    else if (window.getComputedStyle)
        var y = document.defaultView.getComputedStyle(obj,null).getPropertyValue(styleProp);
    return y;
}

function findRelativeAncestor (obj) {
    if (obj.offsetParent) {
        while (obj.offsetParent) {
            obj = obj.offsetParent;
            if (getStyle(obj, "position") == "relative") return obj;
        }
        return null;
    }
    return null;
}

function findPosX (obj, rootElem) {
    var curleft = 0;
    if (obj.offsetParent) {
        while (obj.offsetParent) {
            if (obj == rootElem) return curleft;
            curleft += obj.offsetLeft
            obj = obj.offsetParent;
        }
    } else if (obj.x) {
        curleft += obj.x;
    }
    return curleft;
}

function findPosY (obj, rootElem) {
    var curtop = 0;
    if (obj.offsetParent) {
        while (obj.offsetParent) {
            if (obj == rootElem) return curtop;
            curtop += obj.offsetTop
            obj = obj.offsetParent;
        }
    } else if (obj.y) {
        curtop += obj.y;
    }
    return curtop;
}