var isDOM=document.getElementById?1:0;
var isIE=document.all?1:0;
var isNS4=navigator.appName=='Netscape'&&!isDOM;
var isOp=self.opera?1:0;

var CSSLITCLASS="highlighted";
var CSSPROP="visibility";
var CSSVIS="visible";
var CSSHID="hidden";
var ANIMSPEED=20;
var SHOWDELAY=0;
var SWITCHDELAY=125;
var HIDEDELAY=500;

function getRef(i) {
    if(isIE) {
        return document.all[i];
    } else if(isDOM) {
            return (document.getElementById?document:document.ownerDocument).getElementById(i);
    } else if(isNS4) {
        return document.layers[i];
    } else {
        return null;
    }
}

function getSty(i) {
    var ref=getRef(i);
    if(!ref) {
        return null;
    } else if(isNS4) {
        return ref;
    } else {
        return ref.style;
    }
}

function LayerObj(i) {
    this.ref=getRef(i);
    this.sty=getSty(i);
    return this;
}

function getLyr(i) {
    return new LayerObj(i);
}

function LyrFn(n, f) {
    LayerObj.prototype[n]=new Function('var a=arguments, p=a[0], px=isNS4||isOp?0:"px";with(this){'+f+'}');
}

function addEvent(owner, evt, fun) {
    var a='addEventListener';
    var h='on'+evt;

    if(owner[a]) {
        return owner[a](evt, fun, false);
    }

    if(owner[h]) {
        owner._c|=0;
        var b='b_'+(++owner._c);
        owner[b]=owner[h];
    }

    owner[h]=function(e) {
        e=e||self.event;
        var r=true;

        if(owner[b]) {
            r=owner[b](e)!=false && r;
        }

        owner._f=fun;
        r=owner._f(e)!=false && r;
        return r;
    }
}

function FSMenu() {
    this.menus=new FSMenuNode('nav_root', true, this);
    this.menuToShow=[];
    this.mtsTimer=null;
    return this;
}

FSMenu.prototype.show=function() {
    with(this) {
        menuToShow.length=arguments.length;
        for(var i=0;i<arguments.length;i++) {
            menuToShow[i]=arguments[i];
        }
        clearTimeout(mtsTimer);
    }
}

FSMenu.prototype.hide=function(mN) {
    with(this) {
        clearTimeout(mtsTimer);
        if(menus[mN]) {
            menus[mN].out();
        }
    }
}

function FSMenuNode(id,isRoot,obj) {
    this.id=id;
    this.isRoot=isRoot;
    this.obj=obj;
    this.lyr=null;
    this.child=null;
    this.par=null;
    this.timer=null;
    this.visible=null;
    this.args=[];
    var node=this;
    this.over=function(evt) {
        with(node) {
            with(obj) {
                if(isNS4&&evt&&lyr.ref) {
                    lyr.ref.routeEvent(evt);
                }
                clearTimeout(timer);
                clearTimeout(mtsTimer);
                if(!isRoot&&!visible) {
                    node.show();
                }
                if(menuToShow.length) {
                    var a=menuToShow,m=a[0];
                    if(!menus[m]||!menus[m].lyr.ref) {
                        menus[m]=new FSMenuNode(m,false,obj);
                    }
                    var c=menus[m];
                    if(c==node) {
                        menuToShow.length=0;
                        return;
                    }
                    clearTimeout(c.timer);
                    if(c!=child&&c.lyr.ref) {
                        c.args.length=a.length;
                        for(var i=0;i<a.length;i++) {
                            c.args[i]=a[i];
                        }
                        var delay=child?SWITCHDELAY:SHOWDELAY;
                        c.timer=setTimeout('with(menu) { menus["'+c.id+'"].par=menus["'+node.id+'"];menus["'+c.id+'"].show() }',
                            delay?delay:1);
                    }
                    menuToShow.length=0;
                }
            }
        }
    }

    this.out=function(evt) {
        with(node) {
            with(obj) {
                if(isNS4&&evt&&lyr&&lyr.ref) {
                    lyr.ref.routeEvent(evt);
                }
                clearTimeout(timer);
                if(!isRoot) {
                    timer=setTimeout('menu.menus["'+id+'"].hide()', HIDEDELAY);
                }
            }
        }
    }

    with(this) {
        with(lyr=getLyr(id)) {
            if(ref) {
                if(isNS4) {
                    ref.captureEvents(Event.MOUSEOVER|Event.MOUSEOUT);
                }
                addEvent(ref,'mouseover',this.over);
                addEvent(ref,'mouseout',this.out);
                addEvent(ref,'focus',this.over);
                addEvent(ref,'click',this.over);
                addEvent(ref,'blur',this.out);
            }
        }
    }
}

FSMenuNode.prototype.show=function() {
    with(this) with(obj) {
        if(!lyr||!lyr.ref) {
            return;
        }
        if(par) {
            if(par.child&&par.child!=this) {
                par.child.hide();
            }
            par.child=this;
        }
        var offR=args[1];
        var offX=args[2];
        var offY=args[3];
        var lX=0;
        var lY=0;
        var doX=((''+offX)!='undefined');
        var doY=((''+offY)!='undefined');
        if(self.page&&offR&&(doX||doY)) {
            with(page.elmPos(offR,par.lyr?par.lyr.ref:0)) {
                lX=x;
                lY=y;
            }
            if(doX) {
                lyr.x(lX+eval(offX));
            }
            if(doY) {
                lyr.y(lY+eval(offY));
            }
        }
        if(offR) {
            highlight(offR,1);
        }
        visible=1;
        if(obj.onshow) {
            obj.onshow(id);
        }
        setVis(1);
    }
}

FSMenuNode.prototype.hide=function() {
    with(this) {
        with(obj) {
            if(!lyr||!lyr.ref) {
                return;
            }
            if(isNS4&&self.isMouseIn&&isMouseIn(lyr.ref)) {
                return show();
            }
            if(args[1]) {
                highlight(args[1],0);
            }
            if(child) {
                child.hide();
            }
            if(par&&par.child==this) {
                par.child=null;
            }
            par=null;
            if(lyr) {
                visible=0;
                if(obj.onhide) {
                    obj.onhide(id);
                }
                setVis(0);
            }
        }
    }
}

FSMenuNode.prototype.highlight=function(elm, lit) {
    if(isNS4) {
        return;
    }
    li=elm;
    while(li && li.nodeName.toLowerCase()!='li') {
        li=li.parentNode;
    }
    if(!li) {
        return;
    }
    if(lit) {
        li.className=CSSLITCLASS;
    } else {
        li.className="";
    }
}

FSMenuNode.prototype.setVis=function(sh) {
    with(this) {
        with(obj) {
            lyr.timer|=0;
            lyr.counter|=0;
            with(lyr) {
                clearTimeout(timer);
                if(sh&&!counter) {
                    sty[CSSPROP]=CSSVIS;
                }
                if(isDOM) {
                    var cP=counter/100;
                    ref.style.clip=(counter==100?(window.opera?'':'rect(auto,auto,auto,auto)'):'rect(0,'+(ref.offsetWidth*cP)+'px,'+(ref.offsetHeight*cP)+'px,0)');
                }
                counter+=ANIMSPEED*(sh?1:-1);
                if(counter>100) {
                    counter=100;
                } else if(counter<=0) {
                    counter=0;
                    sty[CSSPROP]=CSSHID;
                } else if(isDOM) {
                    timer=setTimeout('menu.menus["'+id+'"].setVis('+sh+')',50)
                }
            }
        }
    }
}

FSMenu.prototype.activateMenu=function(id,subInd) {
    with(this) {
        if(!isDOM) {
            return;
        }
        var a;
        var ul;
        var li;
        var mRoot=getRef(id);
        var nodes;
        var count=1;
        if(mRoot==null) {
            return;
        }
        if(isIE) {
            var aNodes=mRoot.getElementsByTagName('a');
            for(var i=0;i<aNodes.length;i++) {
                addEvent(aNodes[i],'focus',new Function('e','var node=this.parentNode;while(node){if(node.onfocus)setTimeout(node.onfocus,1,e);node=node.parentNode}'));
                addEvent(aNodes[i],'blur',new Function('e','var node=this.parentNode;while(node){if(node.onblur)node.onblur(e);node=node.parentNode}'))
            }
        }
        var lists=mRoot.getElementsByTagName('ul');
        for(var i=0;i<lists.length;i++) {
            li=ul=lists[i];
            while(li) {
                if(li.nodeName.toLowerCase()=='li')
                    break;
                li=li.parentNode;
            }
            if(!li) {
                continue;
            }
            a=null;
            for(var j=0;j<li.childNodes.length;j++) {
                if(li.childNodes[j].nodeName.toLowerCase()=='a') {
                    a=li.childNodes[j];
                }
            }
            if(!a) {
                continue;
            }
            var menuID='menu-id-'+count++;
            if(ul.id) {
                menuID=ul.id;
            } else {
                ul.setAttribute('id',menuID);
            }
            var eShow=new Function('menu.show("'+menuID+'", this)');
            var eHide=new Function('menu.hide("'+menuID+'")');
            addEvent(a,'mouseover',eShow);
            addEvent(a,'focus',eShow);
            addEvent(a,'mouseout',eHide);
            addEvent(a,'blur',eHide);

            if(subInd) {
                a.insertBefore(subInd.cloneNode(true), a.firstChild);
            }
        }
        menus[id]=new FSMenuNode(id,true,this);
    }
}

var menu=new FSMenu();

function loadHandler() {
    if(!isDOM) {
        return;
    }
    var arrow=null;
    if(document.createElement&&document.documentElement) {
        arrow=document.createElement('span');
        arrow.appendChild(document.createTextNode('>'));
        arrow.className='arrow';
    }
    menu.activateMenu("nav_root", arrow);
}

if(navigator.userAgent.indexOf('KHTML')>-1)
    var khtmlLoad=setInterval('if(document.readyState=="complete") { clearInterval(safHack); loadHandler(); }',100);
else {
    addEvent(window,'load',loadHandler);
}
