var cntr_ElementOverloader = 0;
var cntr_MenuPopout = 0;
var ElementOverloaders = new Array();
var MenuPopouts = new Array();
var SideScrollImage = null;
var SideScrollImageHeight = 0;
var SideScrollImageVisible = false;
var SideScrollImageCurrentMenu = null;
var SideScrollImageOverloader = null;
var AnchorOffset = 0;
var MouseY = 0;
var SideScrollSpeed = 15;

//GLOBAL FUNCTION
function GetDropDowns(parent)
{
    var ret = new Array();
    var nodes = parent.getElementsByTagName("*");
    for (var i = 0; i < nodes.length; i++)
    {
        var node = nodes[i];
        try
        {
          if (node.getAttribute("ddm") == "true")
          {
              ret.push(node);
          }
        }
        catch(error) {}
    }
    
    return ret;
}
//GLOBAL FUNCTION
function ConstructMenus()
{
    var nodes = GetDropDowns(document);
    var handles = new Array();
    for (var i = 0; i < nodes.length; i++)
    {
        var node = nodes[i];
        handles.push(new MenuPopout(node.getAttribute("id"), node.getAttribute("ddm_content"), node.getAttribute("ddm_dir"), node.getAttribute("ddm_root") == "true"));
    }
    for (var i = 0; i < handles.length; i++)
    {
        var handle = handles[i];
        
        var subnodes = GetDropDowns(handle.content);
        for (var j = 0; j < subnodes.length; j++)
        {
            var subnode = subnodes[j];
            var subid = subnode.getAttribute("id");
            var subhandle = null;
            for (var k = 0; k < nodes.length; k++)
            {
                if (nodes[k].getAttribute("id") == subid)
                {
                    subhandle = handles[k];
                    break;
                }
            }
            
            if (subhandle == null) alert("Fatil Error: Unable to recover handle!");
            
            handle.AddChild(subhandle);
        }
    }
}

//GLOBAL FUNCTION
function f_scrollTop() {
	return f_filterResults (
		window.pageYOffset ? window.pageYOffset : 0,
		document.documentElement ? document.documentElement.scrollTop : 0,
		document.body ? document.body.scrollTop : 0
	);
}
function f_filterResults(n_win, n_docel, n_body) {
	var n_result = n_win ? n_win : 0;
	if (n_docel && (!n_result || (n_result > n_docel)))
		n_result = n_docel;
	return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}

// BEGIN CLASS ElementOverloader
function ElementOverloader(id)
{
    this.element = document.getElementById(id);
    this.overloads = new Array();
    this.id = cntr_ElementOverloader++;
    this.hasfocus = false;
    this.children = new Array();
    this.isparent = false;
    
    ElementOverloaders.push(this);
}

function ElementOverloader_GetHasFocus()
{
    if (this.hasfocus) return true;
    for (var i = 0; i < this.children.length; i++)
        if (this.children[i].GetHasFocus()) return true;
    return false;
}

function ElementOverloader_CallOverloadsFor(event, target)
{
    event = event.toLowerCase();
    for (var i = 0; i < this.overloads.length; i++)
        if (this.overloads[i].event == event)
        {
            for (var j = 0; j < this.overloads[i].overloads.length; j++)
                this.overloads[i].overloads[j].call(target, this.element);
            break;
        }
}

function ElementOverloader_Overload(event, target, func)
{
    event = event.toLowerCase();
    var indx = -1;
    for (var i = 0; i < this.overloads.length; i++)
        if (this.overloads[i].event == event)
        {
            indx = i;
            break;
        }
    if (indx == -1)
    {
        var eeo = new ElementEventOverload(event, target, func, this.id);
        
        this.overloads.push(eeo);
        
        eval("this.element." + event + " = eeo.calltarget;");
    }
    else
    {
        this.overloads[indx].overloads.push(func);
    }
}


ElementOverloader.prototype.CallOverloadsFor = ElementOverloader_CallOverloadsFor;
ElementOverloader.prototype.Overload = ElementOverloader_Overload;
ElementOverloader.prototype.GetHasFocus = ElementOverloader_GetHasFocus;
//END CLASS ElementOverloader

//BEGIN CLASS ElementEventOverload
function ElementEventOverload(event, target, func, parent)
{
    this.event = event;
    this.calltarget = function()
    {
        GetOverloader(parent).CallOverloadsFor(event, target);
    }
    this.overloads = new Array();
    this.overloads.push(func);
}
//END CLASS ElementEventOverload

function GetPopout(id)
{
    for (var i = 0; i < MenuPopouts.length; i++)
        if (MenuPopouts[i].id == id) return MenuPopouts[i];
    return null;
}

function GetOverloader(id)
{
    for (var i = 0; i < ElementOverloaders.length; i++)
        if (ElementOverloaders[i].id == id) return ElementOverloaders[i];
    return null;
}

function GetOverloaderFor(id)
{
    for (var i = 0; i < ElementOverloaders.length; i++)
        if (ElementOverloaders[i].element == id)
            return ElementOverloaders[i];
        
    return new ElementOverloader(id);
}

//BEGIN CLASS Point
function Point(x,y)
{
    this.x = x;
    this.y = y;
}
//END CLASS Point
function FindAbsXY(element)
{
    var x = element.offsetLeft;
    var y = element.offsetTop;
    
    if (element.offsetParent != null)
    {
        var pt = FindAbsXY(element.offsetParent);
        x += pt.x;
        y += pt.y;
    }
    
    return new Point(x, y);
}

function fmwf(element)
{
    if (!element.GetHasFocus()) return null;
    
    if (element.hasfocus)
    {
        if (element.isparent) return null;
        else return element;
    }
    
    for (var i = 0; i < element.children.length; i++)
    {
        var r = fmwf(element.children[i]);
        if (r != null) return r;
    }
}

function FindMenuWithFocus()
{
    for (var i = 0; i < MenuPopouts.length; i++)
    {
        var r = fmwf(MenuPopouts[i].anchoroverloader);
        if (r != null) return r;
    }
    
    return null;
}

//BEGIN CLASS MenuPopout
function MenuPopout(anchor, content, direction, isparent)
{
    this.id = cntr_MenuPopout++;
    MenuPopouts.push(this);
    this.anchor = document.getElementById(anchor);
    
    this.content = document.getElementById(content);
    this.content.style.visibility = "hidden";
    this.content.style.position = "absolute";
    this.content.style.top = "0px";
    this.content.style.left = "0px";
    this.direction = direction.toLowerCase();
    this.ischild = false;
    this.totalbump = 0;
    this.scrollout = false;
    
    this.anchoroverloader = GetOverloaderFor(anchor);
    this.contentoverloader = GetOverloaderFor(content);
    this.anchoroverloader.children.push(this.contentoverloader);
    this.anchoroverloader.isparent = isparent;
    
    this.anchoroverloader.Overload("OnMouseOver", this,
        function()
        {
            this.anchoroverloader.hasfocus = true;
            this.focuscheckinteravl = window.setInterval("GetPopout(" + this.id + ").FocusCheck();", 100);
        
            var loc = FindAbsXY(this.anchor);
            if (this.direction == "down")
            {
                this.content.style.top = (loc.y + this.anchor.offsetHeight - 5) + "px";
                this.content.style.left = (loc.x + 5) + "px";
            }
            else if (this.direction == "right")
            {
                this.content.style.top = (loc.y - 5) + "px";
                this.content.style.left = (loc.x + this.anchor.offsetWidth - 5) + "px";
            }
            else if (this.direction == "left")
            {
                this.content.style.top = (loc.y - 5) + "px";
                this.content.style.left = (loc.x - this.content.offsetWidth + 5) + "px";
            }
            else if (this.direction == "up")
            {
                this.content.style.top = (loc.y - this.content.offsetHeight) + "px";
                this.content.style.left = (loc.x + 5) + "px";
            }
            this.content.style.visibility = "visible";
            
            this.scrollout = true;
            if (this.ischild) window.setTimeout("GetPopout(" + this.id + ").BumpSide();", SideScrollSpeed);
        }
    );
    this.anchoroverloader.Overload("OnMouseOut", this,
        function()
        {
            this.anchoroverloader.hasfocus = false;
        }
    );
    
    this.contentoverloader.Overload("OnMouseOver", this,
        function()
        {
            this.contentoverloader.hasfocus = true;
        }
    );
    this.contentoverloader.Overload("OnMouseOut", this,
        function()
        {
            this.contentoverloader.hasfocus = false;
        }
    );
}

function MenuPopout_FocusCheck()
{
    if (!this.anchoroverloader.GetHasFocus())
    {
        window.clearInterval(this.focuscheckinterval)
        this.content.style.visibility = "hidden";
        this.content.style.top = "0px";
        this.content.style.left = "0px";
    }
}
function MenuPopout_AddChild(child)
{
    child.ischild = true;
    this.anchoroverloader.children.push(child.anchoroverloader);
}
function MenuPopout_BumpSide()
{
    if (this.anchoroverloader.hasfocus)
    {
        if (this.scrollout)
        {
            if (this.totalbump < 5)
            {
                AnchorOffset++;
                this.totalbump++;
            }
            if (this.totalbump == 5)
                this.scrollout = false;
        }
        else
        {
            if (this.totalbump > 0)
            {
                AnchorOffset--;
                this.totalbump--;
            }
        }
    }
    else
    {
        AnchorOffset -= this.totalbump;
        this.totalbump = 0;
    }
    
    SideScrollImageUpdate();
    if (this.totalbump > 0) window.setTimeout("GetPopout(" + this.id + ").BumpSide();", SideScrollSpeed);
}

MenuPopout.prototype.FocusCheck = MenuPopout_FocusCheck;
MenuPopout.prototype.AddChild = MenuPopout_AddChild;
MenuPopout.prototype.BumpSide = MenuPopout_BumpSide;

//END CLASS MenuPopout

//GLOBAL FUNCTION
function SetSideScrollImage(id, h)
{
    var sidediv = document.getElementById(id);
    sidediv.style.position = "absolute";
    sidediv.style.visibility = "hidden";
    SideScrollImageHeight = h;
    SideScrollImage = sidediv;
    SideScrollImageOverloader = GetOverloaderFor(id);
    SideScrollImageOverloader.Overload("OnMouseOver", SideScrollImageOverloader, function() { this.hasfocus = true; });
    SideScrollImageOverloader.Overload("OnMouseOut", SideScrollImageOverloader, function() { this.hasfocus = false; });
}

//GLOBAL FUNCTION
function SideScrollImageUpdateMouseIE()
{
    MouseY = event.clientY;
    SideScrollImageUpdate();
}

//GLOBAL FUNCTION
function SideScrollImageUpdate()
{
    if (SideScrollImage == null) return;

    var menu = FindMenuWithFocus();

    if (menu == null)
    {
        SideScrollImageVisible = false;
        SideScrollImage.style.visibility = "hidden";
    }
    else
    {
        if (SideScrollImageCurrentMenu != menu)
        {
            if (SideScrollImageCurrentMenu != null)
            {
                for (var i = SideScrollImageCurrentMenu.children.length - 1; i >= 0; i--)
                {
                    if (SideScrollImageCurrentMenu.children[i] == SideScrollImageOverloader)
                    {
                        SideScrollImageCurrentMenu.children.splice(i, 1);
                        break;
                    }
                }
            }
            SideScrollImageCurrentMenu = menu;
            SideScrollImageCurrentMenu.children.push(SideScrollImageOverloader);
        }
    
        if (!SideScrollImageVisible)
        {
            SideScrollImage.style.visibility = "visible";
            SideScrollImageVisible = true;
        }
        SideScrollImage.style.top = ((MouseY - SideScrollImageHeight) + f_scrollTop()) + "px";
        SideScrollImage.style.left = (FindAbsXY(menu.element).x + AnchorOffset) + "px";
    }
}

//GLOBAL FUNCTION
function EnableSideScrollImage(id)
{
    var e = new ElementOverloader(id);
    e.Overload("OnMouseMove", this, SideScrollImageUpdateMouseIE);
    return e;
}

//BEGIN CLASS Rollover
function Rollover(id, imgout, imgin)
{
    this.imgout = new Image();
    this.imgout.src = imgout;
    
    this.imgin = new Image();
    this.imgin.src = imgin;
    
    this.element = document.getElementById(id);
    this.overloader = GetOverloaderFor(id);
    this.overloader.Overload("OnMouseOut", this, 
        function()
        {
            this.element.src = this.imgout.src;
            this.overloader.hasfocus = false;
        }
    );
    this.overloader.Overload("OnMouseOver", this, 
        function()
        {
            this.element.src = this.imgin.src;
            this.overloader.hasfocus = true;
        }
    );
}
//END CLASS Rollover

//BEGIN CLASS ClickLink
function ClickLink(id, dest)
{
    this.dest = dest;
    this.overloader = GetOverloaderFor(id);
    this.overloader.Overload("OnClick", this,
        function()
        {
            location.href = this.dest;
        }
    );
}
//END CLASS ClickLink

//GLOBAL FUNCTION [CallRate 250]
var CurPDFContext = false;
function CheckPDFContextChange(pdfid, defsrc, newsrc)
{
    var HasContext = false;
    for (var i = 0; i < ElementOverloaders.length; i++)
    {
        if (ElementOverloaders[i].GetHasFocus())
        {
            HasContext = true;
            break;
        }
    }
    
    if (HasContext != CurPDFContext)
    {
        var element = document.getElementById(pdfid);
        if (HasContext)
        {
            element.src = newsrc;
        }
        else
        {
            element.src = defsrc;
        }
    }
    
    CurPDFContext = HasContext;
}

//GLOBAL FUNCTION
function StartCheckPDFContextChange(pdfid, defsrc, newsrc)
{
    return window.setInterval("CheckPDFContextChange('" + pdfid + "','" + defsrc + "','" + newsrc + "');", 250);
}
//GLOBAL FUNCTION
function StopCheckPDFContextChange(interval)
{
    window.clearInterval(interval);
}
//GLOBAL FUNCTION
function RestartCheckPDFContextChange(interval, pdfid, defsrc, newsrc)
{
    window.clearInterval(interval);
    interval = window.setInterval("CheckPDFContextChange('" + pdfid + "','" + defsrc + "','" + newsrc + "');", 250);
}
