﻿

function getElemPositionByAlignment(elem, alignment){
    el = elem;
    for (var lx=0,ly=0,lw=el.offsetWidth,lh=el.offsetHeight;el!=null;lx+=el.offsetLeft,ly+=el.offsetTop,el=el.offsetParent);
    
    return {
        x:lx,y:ly,
        h:lh,w:lw,
        alignment:getAlignment(lx,ly,lh,lw,alignment)
        }
}

var ElemAlignment = {TopLeft:0,TopRight:1,BottomLeft:2,BottomRight:3,Center:4}
function getAlignment(lx,ly,lh,lw, alignment){
    var position;
    switch(alignment){
        case ElemAlignment.TopLeft: 
            position = {x:lx,y:ly};
            break;
        case ElemAlignment.TopRight: 
            position = {x:(lx+lw),y:ly};
            break;
        case ElemAlignment.BottomLeft:
            position = {x:lx,y:(ly+lh)};
            break;
        case ElemAlignment.BottomRight: 
            position = {x:(lx+lw),y:(ly+lh)};
            break;
        case ElemAlignment.Center: 
            position = {x:(lx+(lw/2)),y:(ly+(lh/2))};
            break;
         default: 
            position = {x:lx,y:ly};
            break;
    }
    return position;
}

function ChangeElemPositionByElem2(elem, elem2, elemAlignment, elem2Alignment){
    ChangeElemPositionByElem2WithOffsets(elem, elem2, elemAlignment, elem2Alignment, 0, 0);
}
function ChangeElemPositionByElem2WithOffsets(elem, elem2, elemAlignment, elem2Alignment, xOffset, yOffset){
    var elemPos = getElemPositionByAlignment(elem, elemAlignment);
    var elem2Pos = getElemPositionByAlignment( elem2, elem2Alignment);
    
    elem.style.top = (elem2Pos.alignment.y - (elemPos.alignment.y - elemPos.y) + yOffset) + "px";
    elem.style.left = (elem2Pos.alignment.x - (elemPos.alignment.x - elemPos.x)+ xOffset) + "px";
}

function ChangeElemPositionByWindow(elem, elemAlignment, windowAlignment){
    var elemPos = getElemPositionByAlignment(elem, elemAlignment);
    var Window = getWindowSizeAndAlignment(windowAlignment);
    //alert(Window.x + "," + Window.y + "," + Window.w + "," + Window.h + "," + Window.topOffset + "," + Window.alignment.x + "," + Window.alignment.y);
    //alert(elemPos.x + "," + elemPos.y + "," + elemPos.w + "," + elemPos.h + ", " + "," + elemPos.alignment.x + "," + elemPos.alignment.y);
    //alert(Window.alignment.y - (elemPos.alignment.y - elemPos.y));
    //alert(Window.alignment.x - (elemPos.alignment.x - elemPos.x));
    elem.style.position = 'absolute';
    elem.style.top = (Window.alignment.y - (elemPos.alignment.y - elemPos.y)) + "px";
    elem.style.left = (Window.alignment.x - (elemPos.alignment.x - elemPos.x)) + "px";
}

function getWindowSizeAndAlignment(alignment){
    var myWidth = 0, myHeight = 0, myTop = 0;
    if( typeof( window.innerWidth ) == 'number' ) {
        //Non-IE
        myWidth = window.innerWidth;
        myHeight = window.innerHeight;
        myTop = eval(window.pageYOffset);
    } 
    else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
        //IE 6+ in 'standards compliant mode'
        myWidth = document.documentElement.clientWidth;
        myHeight = document.documentElement.clientHeight;
        if (!document.documentElement.scrollTop){myTop = 0;}
        else {myTop = document.documentElement.scrollTop;}
    } 
    else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
        //IE 4 compatible
        myWidth = document.body.clientWidth;
        myHeight = document.body.clientHeight;
        myTop = document.body.scrollTop;
    }
    return {
        x:0,y:0,
        h:myHeight,w:myWidth,
        alignment:getAlignment(0,0,myHeight,myWidth,alignment),
        topOffset:myTop
        }
}


var ElemDisplaylist = new Object();

function gEBId(id){return document.getElementById(id);}

function HideElem(elem){ 
    EnsureElemHasId(elem);
    if(ElemDisplaylist[elem.id] && ElemDisplaylist[elem.id].DelayHide != null){
        ElemDisplaylist[elem.id].DelayHide = null;
        
    }
    //Store Original DisplayStyle
    if(elem.style.display != "none"){
        ElemDisplaylist[elem.id].old.style.display = elem.style.display;
    }
    elem.style.display = "none"; 
}

function ShowElem(elem){
    EnsureElemHasId(elem);
    var eDisplayStyle;
    if(ElemDisplaylist[elem.id] && ElemDisplaylist[elem.id].DelayHide != null){ 
        clearTimeout(ElemDisplaylist[elem.id].DelayHide);
        ElemDisplaylist[elem.id].DelayHide = null;
    }
    if(ElemDisplaylist[elem.id] && ElemDisplaylist[elem.id].old.style.display){ eDisplayStyle = ElemDisplaylist[elem.id].old.style.display; }
    if(eDisplayStyle == null || eDisplayStyle ==""){ elem.style.display = "block"; }
    else { elem.style.display = eDisplayStyle; }
}

var elemIdInt = 0;
function EnsureElemHasId(elem){
    if (elem.id == null || elem.id == ""){ 
        elem.id = "" + Date() + elemIdInt; 
        elemIdInt++
    }
}

//still a work in progress
function DelayedHideElem(elem, delay){
    alert( elem.id + " : " + delay);
    EnsureElemHasId(elem);
    ElemDisplaylist[elem.id].DelayHide = setTimeout("HideElem(document.getElementById('" + elem.Id + "'))",delay);
}


