var isDOM=document.getElementById?1:0,isIE=document.all?1:0,isOp=self.opera?1:0,isDyn=isDOM||isIE;

function getRef(i,p) {
	p=!p?document:p.navigator?p.document:p;
	return isIE?p.all[i]:isDOM?(p.getElementById?p:p.ownerDocument).getElementById(i):null;
}

function getSty(i,p) { var r=getRef(i,p); return r?r.style:null; }

if (!self.LayerObj) var LayerObj=new Function('i','p','this.ref=getRef(i,p);this.sty=getSty(i,p);return this');

function getLyr(i,p) { return new LayerObj(i,p) }

function LyrFn(n,f) { LayerObj.prototype[n]=new Function('var a=arguments,p=a[0],px=isOp?0:"px";'+'with(this) {'+f+'}'); }
LyrFn('x','if (!isNaN(p)) sty.left=p+px; else return parseInt(sty.left)');
LyrFn('y','if (!isNaN(p)) sty.top=p+px; else return parseInt(sty.top)');

if (typeof addEvent!='function') {
	var addEvent=function(o,t,f,l) {
		var d='addEventListener',n='on'+t,rO=o,rT=t,rF=f,rL=l;
		if (o[d]&&!l) return o[d](t,f,false);
		if (!o._evts) o._evts={};
		if (!o._evts[t]) {
			o._evts[t]=o[n]?{b:o[n]}:{};
			o[n]=new Function('e','var r=true,o=this,a=o._evts["'+t+'"],i;for (i in a) {o._f=a[i];r=o._f(e||window.event)!=false&&r;o._f=null;} return r');
			if (t!='unload') addEvent(window,'unload',function() { removeEvent(rO,rT,rF,rL);});
		}
		if (!f._i) f._i=addEvent._i++;
		o._evts[t][f._i]=f;
	};
	addEvent._i=1;
	var removeEvent=function(o,t,f,l) {
		var d='removeEventListener';
		if (o[d]&&!l) return o[d](t,f,false);
		if (o._evts&&o._evts[t]&&f._i) delete o._evts[t][f._i];
	};
}

function FSMenu(myName,nested,cssProp,cssVis,cssHid) {
	this.myName=myName; this.nested=nested;
	this.cssProp=cssProp; this.cssVis=cssVis; this.cssHid=cssHid; this.cssLitClass='';
	this.menus={root:new FSMenuNode('root',true,this)}; this.menuToShow=[]; this.mtsTimer=null;
	this.showDelay=0; this.switchDelay=125; this.hideDelay=500; this.showOnClick=0; this.hideOnClick=true;
	this.animInSpeed=0.2; this.animOutSpeed=0.2; this.animations=[];
}

FSMenu.prototype.show=function(mN) {
	with (this) {
		menuToShow.length=arguments.length;
		for (var i=0;i<arguments.length;i++) menuToShow[i]=arguments[i];
		clearTimeout(mtsTimer);
		if (!nested) mtsTimer=setTimeout(myName+'.menus.root.over()',10);
	}
}

FSMenu.prototype.hide=function(mN) {
	with (this) {
		clearTimeout(mtsTimer);
		if (menus[mN]) menus[mN].out();
	}
}

FSMenu.prototype.hideAll=function() {
	with (this) { for (var m in menus) if (menus[m].visible&&!menus[m].isRoot) menus[m].hide(true); }
}

function FSMenuNode(id,isRoot,obj) {
	this.id=id; this.isRoot=isRoot; this.obj=obj; this.lyr=this.child=this.par=this.timer=this.visible=null; this.args=[]; var node=this;

	this.over=function(evt) {
		with (node) with (obj) {
			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('+myName+') {menus["'+c.id+'"].par=menus["'+node.id+'"];menus["'+c.id+'"].show()}',delay?delay:1);
				}
			menuToShow.length = 0;
			}
			if (!nested&&par) par.over();
		}
	};

	this.out=function(evt) {
		with (node) with (obj) {
			clearTimeout(timer);
			if (!isRoot) {
				timer=setTimeout(myName+'.menus["'+id+'"].hide()',hideDelay);
				if (!nested&&par) par.out();
			}
		}
	}

	if (this.id!='root') with (this) with (lyr=getLyr(id)) if (ref) {
		addEvent(ref,'mouseover',this.over); addEvent(ref,'mouseout',this.out);
		if (obj.nested) { addEvent(ref,'focus',this.over); addEvent(ref,'click',this.over); addEvent(ref,'blur',this.out); }
		}
	}

FSMenuNode.prototype.show=function(forced) {
	with (this) with (obj) {
		if (!lyr||!lyr.ref) return;
		if (par) {
			if (par.child&&par.child!=this) par.child.hide();
			par.child=this;
		}
		if (par.child.id) {
			set_m=par.child.id; set_m=document.getElementById(set_m); set_m=set_m.offsetHeight;
			var element = document.documentElement || document.body;
			pw = isIE && element.offsetHeight || innerHeight;
		}
		var offR = args[1], offX=args[2], offY=args[3], lX=0, lY=0, doX=''+offX!='undefined', doY=''+offY!='undefined';
		if ( self.page && offR && ( doX || doY )) {
			with (page.elmPos(offR,par.lyr?par.lyr.ref:0)) lX=x,lY=y;
			
			if (pw-(lY+set_m)<0) {
				lY=(lY-set_m)+offR.offsetHeight;
				lY=lY<0?lY+offR.offsetHeight:lY;
				if( lY < 5 ) lY = 5;
				}
			if (doX) lyr.x(lX+eval(offX));
			if (doY) lyr.y(lY+eval(offY));
		}

		if (offR) lightParent(offR,1);

		visible=1;
		if (obj.onshow) obj.onshow(id);
		lyr.ref.parentNode.style.zIndex='2';
		setVis(1,forced);
	}
}

FSMenuNode.prototype.hide=function(forced) {
	with (this) with (obj) {
		if (!lyr||!lyr.ref||!visible) return;
		if (args[1]) lightParent(args[1],0);
		if (child) child.hide();
		if (par&&par.child==this) par.child=null;
		if (lyr) {
			visible=0;
			if (obj.onhide) obj.onhide(id);
			lyr.ref.parentNode.style.zIndex='1';
			setVis(0,forced);
		}
	}
}

FSMenuNode.prototype.lightParent=function(elm,lit) {
	with (this) with (obj) {
		if (!cssLitClass) return;
		if (lit) elm.className+=(elm.className?' ':'')+cssLitClass;
		else elm.className=elm.className.replace(new RegExp('(\\s*'+cssLitClass+')+$'),'');
	}
}

FSMenuNode.prototype.setVis=function(sh,forced) {
	with (this) with (obj) {
		if (lyr.forced&&!forced) return;
		lyr.forced=forced; lyr.timer=lyr.timer||0; lyr.counter=lyr.counter||0;
		with (lyr) {
			clearTimeout(timer);
			if (sh&&!counter) sty[cssProp]=cssVis;
			var speed=sh?animInSpeed:animOutSpeed;
			if (isDOM&&speed<1)
				for (var a=0;a<animations.length;a++) animations[a](ref,counter,sh);
			counter+=speed*(sh?1:-1);
			if (counter>1) { counter=1; lyr.forced=false; }
			else if (counter<0) { counter=0; sty[cssProp]=cssHid; lyr.forced=false; }
			else if (isDOM) { timer=setTimeout(myName+'.menus["'+id+'"].setVis('+sh+','+forced+')',50); }
		}
	}
}

FSMenu.animSwipeDown=function(ref,counter,show) {
	if (show&&(counter==0)) {
		ref._fsm_styMT=ref.style.marginTop;
		ref._fsm_curMT=parseInt(ref.currentStyle?ref.currentStyle.marginTop:(document.defaultView&&document.defaultView.getComputedStyle?    document.defaultView.getComputedStyle(ref,null).getPropertyValue('marginTop'):0));
	}
	var cP=Math.pow(Math.sin(Math.PI*counter/2),0.75); var clipY=ref.offsetHeight*(1-cP);
	ref.style.clip=(counter==1?((window.opera||navigator.userAgent.indexOf('KHTML')>-1)?'':'rect(auto,auto,auto,auto)'):'rect('+clipY+'px, '+ref.offsetWidth+'px, '+ref.offsetHeight+'px, 0)');
	if (counter==1||(counter<0.01&&!show)) {
		if (ref._fsm_styMT) ref.style.marginTop=ref._fsm_styMT;
		else if (ref.style.removeProperty) ref.style.removeProperty('margin-top',true);
		else if (ref.style.cssText) ref.style.cssText=ref.style.cssText.replace(/MARGIN-TOP:[^;]*;\s*/i,'');
	} else ref.style.marginTop=((0-clipY)+(ref._fsm_curMT||0))+'px';
}

FSMenu.animFade=function(ref,counter,show) {
	var done=(counter==1);
	if (ref.filters) {
		var alpha=!done?' alpha(opacity='+parseInt(counter*100)+')':'';
		if (ref.style.filter.indexOf("alpha")==-1) ref.style.filter+=alpha;
		else ref.style.filter=ref.style.filter.replace(/\s*alpha\([^\)]*\)/i,alpha);
	} else ref.style.opacity=ref.style.MozOpacity=counter/1.001;
}

FSMenu.animClipDown=function(ref,counter,show) {
	var cP=Math.pow(Math.sin(Math.PI*counter/2),0.75);
	ref.style.clip=(counter==1?((window.opera||navigator.userAgent.indexOf('KHTML')>-1)?'':'rect(auto,auto,auto,auto)'):'rect(0, '+ref.offsetWidth+'px, '+(ref.offsetHeight*cP)+'px, 0)');
}

FSMenu.prototype.activateMenu=function(id,subInd) {
	with (this) {
		if (!isDOM||!document.documentElement) return;
		var fsmFB=getRef('fsmenu-fallback');
		if (fsmFB) { fsmFB.rel='alternate stylesheet'; fsmFB.disabled=true; }

		var a,ul,li,parUL,mRoot=getRef(id),nodes,count=1;

		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;
			parUL=li;
			while (parUL) {
				if (parUL.nodeName.toLowerCase()=='ul') break;
				parUL=parUL.parentNode;
			}

			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=myName+'-id-'+count++;

			if (ul.id) menuID=ul.id; else ul.setAttribute('id',menuID);

			var sOC=(showOnClick==1&&li.parentNode==mRoot)||(showOnClick==2);

			var evtProp=navigator.userAgent.indexOf('Safari')>-1||isOp?'safRtnVal':'returnValue';

			var eShow=new Function('with ('+myName+') {'+'var m=menus["'+menuID+'"],pM=menus["'+parUL.id+'"];'+(sOC?'if ((pM&&pM.child)||(m&&m.visible))':'')+' show("'+menuID+'",this)}');
			var eHide=new Function('e','if (e.'+evtProp+' != false) '+myName+'.hide("'+menuID+'")');
			addEvent(a,'mouseover',eShow); addEvent(a,'focus',eShow); addEvent(a,'mouseout',eHide); addEvent(a,'blur',eHide);
			if (sOC) addEvent(a,'click',new Function('e',myName+'.show("'+menuID+'",this); if (e.cancelable&&e.preventDefault) e.preventDefault(); '+'e.'+evtProp+' = false; return false'));
			if (subInd) a.insertBefore(subInd.cloneNode(true),a.firstChild);
		}

		if (isIE && !isOp) {
			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) node.onfocus(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 }'));
			}
		}

		if (hideOnClick) addEvent(mRoot,'click',new Function(myName+'.hideAll()')); 

		menus[id]=new FSMenuNode(id,true,this);
	}
}

// 'page' object from layer API code, detects positions of page elements.
var page={win:self,minW:0,minH:0,MS:isIE&&!isOp,db:document.compatMode&&document.compatMode.indexOf('CSS')>-1?'documentElement':'body' };
page.elmPos=function(e,p) {
	var x=0,y=0,w=p?p:this.win;
	e=e?(e.substr?getRef(e,w):e):p;
	if (e&&this.MS&&navigator.platform.indexOf('Mac')>-1&&e.tagName=='A') {
		e.onfocus=new Function('with(event) { self.tmpX=clientX-offsetX;'+'self.tmpY=clientY-offsetY}');
		e.focus(); x=tmpX; y=tmpY; e.blur();
	} else while(e) { x+=e.offsetLeft; y+=e.offsetTop; e=e.offsetParent; }
	return { x:x,y:y }
}
