function MLXGetBrowser() {

  var UserAgent, s, i;

  this.isIE    = false;
  this.isNS    = false;
  this.version = null;

  UserAgent = navigator.userAgent;

  s = "MSIE";
  if ((i = UserAgent.indexOf(s)) >= 0) {
    this.isIE = true;
    this.version = parseFloat(UserAgent.substr(i + s.length));
    return;
  }

  s = "Netscape6/";
  if ((i = UserAgent.indexOf(s)) >= 0) {
    this.isNS = true;
    this.version = parseFloat(UserAgent.substr(i + s.length));
    return;
  }

  s = "Gecko";
  if ((i = UserAgent.indexOf(s)) >= 0) {
    this.isNS = true;
    this.version = 6.1;
    return;
  }
}

function MLXAddEventListener( element, event_name, observer, capturing ) {

	if ( gMLXGetBrowser.isIE) { // IE
		element.attachEvent( "on" + event_name, observer );
		return;
	}

	if (element.addEventListener ) // DOM2
		element.addEventListener( event_name, observer, capturing );
}

function MLXRemoveEventListener( element, event_name, observer, capturing ) {

	if ( gMLXGetBrowser.isIE) { // IE
		element.detachEvent( "on" + event_name, observer );
		return;
	}

	if (element.removeEventListener ) // DOM2
		element.removeEventListener( event_name, observer, capturing );
}

function MLXGetAbsPosLeft(element) {

	return (element.offsetParent) ? element.offsetLeft + MLXGetAbsPosLeft(element.offsetParent) : element.offsetLeft;

}

function MLXGetAbsPosTop(element) {

	return (element.offsetParent) ? element.offsetTop + MLXGetAbsPosTop(element.offsetParent) : element.offsetTop;

}

function MLXGetPageHeight() {

	if(document.documentElement.scrollHeight > document.documentElement.clientHeight)
		return document.documentElement.scrollHeight;
		
	return document.documentElement.clientHeight;
}

function MLXScrollToElement(name) {
	window.scrollTo( 0, MLXGetAbsPosTop(document.getElementsByName(name)[0]));
	return false;
}

function MLXScrollToAnchor() {

	if(window.location.hash) 
		window.setTimeout("MLXScrollToElement(window.location.hash.substring(1))",400);

}

function MLXAdjustLeftColHeight(ID){

	var mainleftele = document.getElementById(ID);
	if(mainleftele) {

		var PageHeight = MLXGetPageHeight();
		
		if(mainleftele.offsetHeight <= PageHeight) {
			mainleftele.style.height = (PageHeight - MLXGetAbsPosTop(mainleftele)) + "px";
		}
	}

}
function MLXMenuHandler(Name){

	this.CloseAllMenus = function () {
		for( var SubMen in myself.MenuEntries[0]) {
			myself.MenuEnd(myself.MenuEntries[0][SubMen]);
		}
	}

	this.MouseClickHandler = function (evt) {

		// clicked on menu?
		var target = evt.target ? evt.target : evt.srcElement;
		while((target != null) && (target != myself.MenuCurrentActive))
			target = target.parentNode;
			
		if(target != myself.MenuCurrentActive)
			myself.CloseAllMenus();
		return true;
	}
	
	this.MenuStart = function (target) {
		
		var SubMenuContainer = document.getElementById( "mlxSubMenus" + target.getAttribute("mlxmenuname")+ target.getAttribute("mlxmenuindex"));
		
		if(SubMenuContainer && SubMenuContainer.style.display!="block") {
		
			if(target.attributes["mlxTitle"])
				window.status = target.attributes["mlxTitle"].nodeValue;
				
			myself.CloseAllMenus();

			SubMenuContainer.style.display="block";
			
			MLXAddEventListener(document, "mouseup", this.MouseClickHandler, true);			
			myself.EvtListenerSet = true;

			myself.MenuCurrentActive = target;
			
			var mlxDynDown = new MLXDnyamize(0, SubMenuContainer.offsetHeight, function(mlxDyn, finished) {mlxDyn.DomEle.style.height = mlxDyn.CVal + "px";}, 400, 50, SubMenuContainer);
			
		}
		
		return 0;
	}
	
	this.MenuEnd = function (target) {

		if(myself.EvtListenerSet == true) {
			MLXRemoveEventListener(document, "mouseup", myself.MouseClickHandler, true);			
			myself.EvtListenerSet = false;
		}
	
		var SubMenuContainer = document.getElementById( "mlxSubMenus" + target.getAttribute("mlxmenuname")+ target.getAttribute("mlxmenuindex"));
		
		if(SubMenuContainer.style.display!="none") 
			SubMenuContainer.style.display="none";
			
		if(myself.MenuCurrentActive == target)
			myself.MenuCurrentActive = null;

		return 0;
	}

	this.AddMenu = function (Level,Index,ID) {
		if(!this.MenuEntries[Level])
			this.MenuEntries[Level] = new Array();
		this.MenuEntries[Level][Index] = document.getElementById(ID);
		return 0;
	}

	this.SubMenuEnter = function (target) {
	
		if(target.className.indexOf("_hovered") < 1)
			target.className += "_hovered";
		
	}
	this.SubMenuLeave = function (target) {
		var pos = target.className.indexOf("_hovered")
		if(pos > 1)
			target.className = target.className.substring(0, pos);
	}
	
	this.MenuEntries = new Array();
	this.Name = Name;
	this.EvtListenerSet = false;
	this.MenuCurrentActive = null;
	
	var myself= this;
	return 0;
}
function MLXAjax(URL, Handler, WaitMsg) {
var objHTTPReq;
	this.createHTTPReq = function() {
		try {
			objHTTPReq = new XMLHttpRequest();
		} catch(w3c) {
			var dummy = new Date().getTime();
			URL += "&_dmy_="+dummy;
			try {
				objHTTPReq = new ActiveXObject("Msxml2.XMLHTTP");
			} catch(msie) {

				try {
					objHTTPReq = new ActiveXObject("Microsoft.XMLHTTP");
				}

				catch(msieold) {
					alert("Your MLXGetBrowser must support AJAX to display this site!");
					objHTTPReq = null;
					return false;
				} // catch(msieold)

			} // catch(msie)

		} // catch(w3c)

		return true;

	} // this.createHTTPReq = function()

	if(!this.createHTTPReq())
		return -10;

	objHTTPReq.onreadystatechange = function() {

		if (objHTTPReq.readyState == 4) {
			if ((objHTTPReq.status != 200) && (objHTTPReq.status != 0))
				return false;

			switch(typeof Handler) {
				case "function":
					Handler(objHTTPReq.responseText, objHTTPReq.readyState );
					break;
				case "string":
					var comp = objHTTPReq.responseText.split("###");
					if(comp.length > 1) {
						eval(comp[0]);
						document.getElementById(Handler).innerHTML = comp[1];
					} else
						document.getElementById(Handler).innerHTML = objHTTPReq.responseText;
					break;
			}

			return true;
		}
		return false;
	};

	try {
		objHTTPReq.open("GET", URL, true);
		objHTTPReq.send(null);
	} catch(msie) {
	}

	if(WaitMsg && (typeof(Handler) == "string"))
		document.getElementById(Handler).innerHTML = WaitMsg;

	return 0;
}

// shadow box stuff start
function MLXShBox_MoveStart(evt, Element) {

	switch(typeof Element) {
		case "string":
			gCurrDDEle =document.getElementById(Element);
			break;
		case "object":
			gCurrDDEle = Element;
			break;
		default:
			return;
	}

	gCurrDDEle.posX = MLXGetAbsPosLeft(gCurrDDEle);
	gCurrDDEle.posY = MLXGetAbsPosTop(gCurrDDEle);
	gCurrDDEle.posHitX = evt.clientX;
	gCurrDDEle.posHitY = evt.clientY;

	MLXAddEventListener(document, "mousemove", MLXShBox_Move, true);
	MLXAddEventListener(document, "mouseup", MLXShBox_MoveEnd, true);


	if(gMLXGetBrowser.isIE) {
		evt.cancelBubble = true;
		evt.returnValue = false;

	} else {
		evt.preventDefault();
		evt.stopPropagation();
	}

	gCurrDDEle.style.margin="0";
	MLXShBox_Move(evt);

}

function MLXShBox_MoveEnd() { // terminate moving

	gCurrDDEle = gOldMouseX = gOldMouseY = 0;

	MLXRemoveEventListener(document, "mousemove", MLXShBox_Move, true);
	MLXRemoveEventListener(document, "mouseup", MLXShBox_MoveEnd, true);

}


function MLXShBox_Move(evt) {

	if(gCurrDDEle) {
var		lEvt = evt || window.event;


var		NewX = gCurrDDEle.posX + lEvt.clientX - gCurrDDEle.posHitX;
var		NewY = gCurrDDEle.posY + lEvt.clientY - gCurrDDEle.posHitY;

		if(!isNaN(NewX))
			gCurrDDEle.style.left = NewX + "px";

		if(!isNaN(NewY))
			gCurrDDEle.style.top  = NewY + "px";

		if(gMLXGetBrowser.isIE) {
			lEvt.cancelBubble = true;
			lEvt.returnValue = false;
		} else {
			lEvt.preventDefault();
			lEvt.stopPropagation();
		}

	}

	return true;
}

function MLXShBox_Add(Where, What, Id, Params) {

var html = "<div id=\""+ Id + "\" class=\"MLXShBox_container\" style=\"width:" + Params["width"] + "; top:" + Params["top"] + "; left:" + Params["left"] + ";\">"+
	"<div class=\"MLXShBox_shdw\" style=\"height:" + Params["height"] + ";\"></div>"+
	"<div onmousedown=\"MLXShBox_MoveStart(event, this.parentNode)\" class=\"MLXShBox_canv normal\" style=\"width:97%; height:" + Params["height"] + ";\">"+
		"<div sonmousedown=\"MLXShBox_MoveStart(event, this.parentNode.parentNode)\" class=\"MLXShBox_ctrl\">&nbsp;X</div>" +
		"<div class=\"MLXShBox_inner\">"+
			What +
		"</div>" +
	"</div>"+
	"</div>";

	var eleDiv = document.createElement("div");
	eleDiv.innerHTML =html;

	switch(typeof Where) {
		case "string":
			InsBeforeEle =document.getElementById(Where);
			break;
		case "object":
			InsBeforeEle = Where;
			break;
		default:
			return;
	}

	InsBeforeEle.parentNode.insertBefore(eleDiv,InsBeforeEle);
}
// shadow box stuff end

// modal overlay stuff:
function MLXModalOverlay_Remove(ID) {
	window.status = "";
	var Body = document.getElementsByTagName("body")[0];
	var SCont = document.getElementById(ID);

	Body.removeChild(SCont);
}


function MLXModalOverlay_ImgOnMouseWheel(event,element) {

	if (!event)
		event = window.event;

	if(!element)
		element = event.target;

	var fact;

	if (event.preventDefault) {
		if(event.detail > 0)
			fact =1.1;
		else if(event.detail < 0)
			fact =0.9;
		event.preventDefault();
	} else {
		if(event.wheelDelta > 0)
			fact=0.9;
		else if(event.wheelDelta < 0)
			fact=1.1;
	}

	MLXModalOverlay_ImgOnLoad(element,fact);

	return false;
}


function MLXModalOverlay_ImgOnLoad(img, fact) {

	var Container=document.getElementById("mlxOverlContainer");
	Container.style.display ="block";
	Container.style.left= "50%";
	Container.style.top= "50%";

	if(img.width) {

		if(!img.orgwidth) {

			img.orgwidth = img.width;
			img.orgheight = img.height;
			img.width = img.orgwidth;
			img.height = img.orgheight;

			if(window.addEventListener)
				img.addEventListener("DOMMouseScroll", MLXModalOverlay_ImgOnMouseWheel, false);

			img.alt = img.width + " x " + img.height;
			if((img.height<400) && (img.width<400))
				fact=2.0;

			var x,y;
			if (self.innerHeight) {
				x = self.innerWidth;
				y = self.innerHeight;
			}
			else if (document.documentElement && document.documentElement.clientHeight)	{
				x = document.documentElement.clientWidth;
				y = document.documentElement.clientHeight;
			}
			else if (document.body) {
				x = document.body.clientWidth;
				y = document.body.clientHeight;
			}

			if(img.width > (x-60)) {
				var factx = img.width / (x-60);
				img.width /=  factx;
				img.height /=  factx;
			}
			if(img.height > (y-60)) {
				var facty = img.height / (y-60);
				img.width /=  facty;
				img.height /=  facty;
			}
		}

		if(fact) {
			if(fact == 1.0) {
				img.width = img.orgwidth;
				img.height = img.orgheight;
			} else {
				img.width *= fact;
				img.height *= fact;
			}
		}

		var bckgnd=document.getElementById("mlxOverlImgBckgnd");
		if(bckgnd) {
			bckgnd.width = img.width;
			bckgnd.height = img.height;
		}

		Container.style.marginLeft=img.width/-2 + "px";

		var temp = img.height/-2;
		if(window.pageYOffset)
			temp += window.pageYOffset;
		else
			temp += document.documentElement.scrollTop;

		if(temp < ((this.window.innerHeight -80)/ -2))
			temp= (this.window.innerHeight -90)/ -2;

		Container.style.marginTop = temp +  "px";
		Container.style.width = (img.width + 20) + "px";
			
		Container=document.getElementById("mlxOverlControl");
		Container.style.width = (img.width + 20) + "px";
		
		Container=document.getElementById("mlxOverl");
		Container.style.backgroundImage ="none";

		if(img.width ==0) window.setTimeout("MLXModalOverlay_ImgOnLoad(document.getElementById('mlxImgOverlImg'),1)", 1000);

	}
}

function MLXModalOverlay_ShowImg(URL, Params) {

	try {
		StopTimer();
	} catch (err) {}

	if(typeof Params == "undefined")
		 Params = {};

	if(typeof Params.Caption == "undefined")
		Params.Caption = "";
	else
		Params.Caption = "&nbsp;" + Params.Caption;

	var Style="";
	var HTML ="";

	if((typeof Params.BackgroundURL == "string") && Params.BackgroundURL)
		HTML += "<img id=\"mlxOverlImgBckgnd\" class=\"mlxOverlImg\" src=\"" + Params.BackgroundURL + "\" style=\" position:absolute;\"/>";
	else
		Style += "background-color:#A0A0A0;";


	HTML += "<img id=\"mlxOverlImg\" class=\"mlxOverlImg\" src=\""+ URL+"\" style=\""+ Style +"\" onLoad =\"MLXModalOverlay_ImgOnLoad(this)\" onclick=\"MLXModalOverlay_Remove('mlxOverlSCont')\" onMouseWheel= \"return MLXModalOverlay_ImgOnMouseWheel(event,this)\"/>";

	window.status = "Use mousewheel to zoom";

	if(typeof Params.Subtitle == "string")
		HTML += "<div class=\"mlxOverlImgSubtitle\">"+Params.Subtitle+"</div>";

	var innerHTML =
	 "<div class=\"mlxOverl\" id=\"mlxOverl\" style=\"height:" + MLXGetPageHeight() + "px;\"></div>" +
	 "<div id=\"mlxOverlContainer\" class=\"mlxOverlContainer\" style=\"display:none;\">" +
	  "<div onmousedown=\"MLXShBox_MoveStart(event, this.parentNode)\" class=\"mlxOverlControl\" id=\"mlxOverlControl\">"+

	   "<span title=\"close\" id=\"mlxOverlClosebutt\" class=\"mlxOverlControlElement\" onclick=\"MLXModalOverlay_Remove('mlxOverlSCont')\">&nbsp;x&nbsp;</span>"+
	   "<span title=\"open in new browser\" class=\"mlxOverlControlElement\" onclick=\"window.open('"+URL+"', 'mlxOverl'); MLXModalOverlay_Remove('mlxOverlSCont');\">&nbsp; &nbsp;&gt;&gt;</span>" +

	   "<span title=\"larger\" class=\"mlxOverlControlElement\" onclick=\"MLXModalOverlay_ImgOnLoad(document.getElementById('mlxOverlImg'),1.5)\">+</span>" +
	   "<span title=\"orginal size\" class=\"mlxOverlControlElement\" onclick=\"MLXModalOverlay_ImgOnLoad(document.getElementById('mlxOverlImg'),1.0)\">&nbsp;1:1&nbsp;</span>" +
	   "<span title=\"smaller\" class=\"mlxOverlControlElement\" onclick=\"MLXModalOverlay_ImgOnLoad(document.getElementById('mlxOverlImg'),0.5)\">&nbsp;-</span>" +
		Params.Caption +
	   "</div>" +
	  HTML +
	 "</div>";

	var eleDiv = document.createElement("div");
	eleDiv.innerHTML = innerHTML;
	eleDiv.id="mlxOverlSCont";
	eleDiv.setAttribute("class","mlxOverlSCont");

	var BodyEle= document.getElementsByTagName("body")[0];
	BodyEle.appendChild(eleDiv,BodyEle);
	
}

function MLXModalOverlay_BoxOnLoad(EleID, stage) {
var EleDOM = document.getElementById(EleID);

	if(!stage && gMLXGetBrowser.isIE) {
		window.setTimeout("MLXModalOverlay_BoxOnLoad('"+ EleID + "',1)", 300);
		return;
	}

	EleDOM.parentNode.previousSibling.style.backgroundImage ='none';
	var Container=document.getElementById("mlxOverlContainer");
	Container.style.display ="block";

	var temp = EleDOM.offsetHeight/-2;
	if(window.pageYOffset)
		temp += window.pageYOffset;
	else
		temp += document.documentElement.scrollTop;

	Container.style.marginTop = temp +  "px";

}

function MLXModalOverlay_ShowBox(HTML, Params) {

	if(typeof StopTimer != "undefined")
		StopTimer();

	if(typeof Params == "undefined")
		 Params = {};

	if(typeof Params["Style"] == "undefined")
		Params["Style"]= "width:48em; height:27em; margin-left:-24em; margin-top:-14em;";

	if(typeof Params['Caption'] == "undefined")
		Params["Caption"] = "";

	Params["Caption"] = "&nbsp;" + Params["Caption"];
	if(HTML.substring(0, 2) == "##") {

		var URL = HTML.substring(2);

		var HTMLTemp ="<iframe name=\"mlxOverlIfram\" id=\"mlxOverlIfram\" scrolling =\"auto\" onload=\"MLXModalOverlay_BoxOnLoad('mlxOverlIfram')\" src=\"" + URL +"\" height=\"100%\" width=\"100%\" frameborder=\"0\">iframes are required</iframe>";

		var innerHTML =
		 "<div class=\"mlxOverl\" id=\"mlxOverl\" style=\"height:" + MLXGetPageHeight() + "px;\"></div>" +
		 "<div id=\"mlxOverlContainer\" class=\"mlxOverlContainer\" style=\"" + Params["Style"] + " display:none;\">" +
		  "<div onmousedown=\"MLXShBox_MoveStart(event, this.parentNode);\" class=\"mlxOverlControl\">"+
		   "<span title=\"close\" id=\"mlxOverlClosebutt\" class=\"mlxOverlControlElement\" onclick=\"MLXModalOverlay_Remove('mlxOverlSCont')\">&nbsp;x&nbsp;</span>" +
		   "<span title=\"open in new browser\" class=\"mlxOverlControlElement\" onclick=\"window.open('"+URL+"', 'mlxOverl'); MLXModalOverlay_Remove('mlxOverlSCont');\">&nbsp;&gt;&gt;&nbsp;</span>" +
		   Params["Caption"] +
		  "</div>"+
		  HTMLTemp +
		 "</div>";

	} else {
		var HTMLTemp = HTML;
		
		if(typeof Params['Valign'] != "undefined")
		   HTMLTemp = "<table border=\"0\" cellpadding=\"0\" width=\"99%\" height=\"99%\"><tr><td height=\"99%\">"+ HTML + "</td></tr></table></div>";

		var innerHTML =
		 "<div class=\"mlxOverl\" id=\"mlxOverl\" style=\"height:" + MLXGetPageHeight() + "px; background-image:none;\"></div>" +
		 "<div id=\"mlxOverlContainer\" class=\"mlxOverlContainer\" style=\"" + Params["Style"] + "\">" +
		  "<div onmousedown=\"MLXShBox_MoveStart(event, this.parentNode)\" class=\"mlxOverlControl\" >"+
		   "<span title=\"close\" id=\"mlxOverlClosebutt\" class=\"mlxOverlControlElement\" onclick=\"MLXModalOverlay_Remove('mlxOverlSCont')\">&nbsp;x&nbsp;</span>"+
		   Params["Caption"] +
		  "</div>" +
		  "<div id=\"mlxOverlInner\" class=\"mlxOverlInner\">" +
		   HTMLTemp +
		  "</div>" +
		 "</div>";
	}

	var eleDiv = document.createElement("div");
	eleDiv.innerHTML = innerHTML;
	eleDiv.id="mlxOverlSCont";
	eleDiv.setAttribute("class","mlxOverlSCont");

	document.getElementsByTagName("body")[0].appendChild(eleDiv);

	if(HTML.substring(0, 2) != "##") {
		document.getElementById("mlxOverlInner").style.display="none";
		var InnerConta = document.getElementById("mlxOverlContainer");
		InnerConta.style.overflow="hidden";
		var temp = new MLXDnyamize(0, parseInt(InnerConta.offsetWidth), function(mlxDyn, finished) {if(finished){mlxDyn.DomEle.style.overflow="visible"; document.getElementById("mlxOverlInner").style.display="block";return;} mlxDyn.DomEle.style.width = mlxDyn.CVal + "px";}, 500, 50, InnerConta);	
	}
}

// modal overlay stuff end

function MLXDnyamize(StartVal, EndVal, Callback, Duration, Interval, DomEle) {

	this.UpdateValLinear = function() {
		var Dat = new Date();
		var Now = Date.parse(Dat) + Dat.getMilliseconds();
		this.CVal = this.SVal + ((Now - this.DynStartTime) / this.DynDeltaTime) * this.DeltaVal;
		return false;
	}

	this.UpdateVal = function() {
		var Dat = new Date();
		var Now = Date.parse(Dat) + Dat.getMilliseconds();
		var Passed = Now - this.DynStartTime;

		if(Passed > this.DynDeltaTime) {
			this.CVal = this.EVal;
			return true;
		}

		switch(this.ApproachFunct) {
			case 1:
				this.CVal = this.SVal + (Passed / this.DynDeltaTime) * this.DeltaVal;
				break;
			case 2:
				var Arg = ((Math.PI * Passed) / (2*this.DynDeltaTime));
				this.CVal = this.SVal + (1-Math.cos(Arg)) * this.DeltaVal;
				break;
			default:
				var Arg = ((Math.PI * Passed) / (2*this.DynDeltaTime));
				this.CVal = this.SVal + Math.sin(Arg) * this.DeltaVal;
				break;
		}

		return false;
	}

	this.TimerFunc = function() {

		myself.TimerHnd = 0;

		var EndReached = myself.UpdateVal();
		Callback(myself, EndReached);

		if(EndReached)
			return;

		myself.TimerHnd = window.setTimeout(function(){myself.TimerFunc();}, myself.DynTimerInterval );
	}

	this.SVal = StartVal;
	this.EVal = EndVal;
	this.DeltaVal = EndVal - StartVal;
	this.ApproachFunct = 0;

var Dat = new Date();
	this.DynStartTime = Date.parse(Dat) + Dat.getMilliseconds();
	this.DynDeltaTime = Duration;
	this.DynEndTime = this.DynStartTime + this.DynDeltaTime ;
	this.DynTimerInterval = Interval;

	switch(typeof DomEle) {
		case "string":
			this.DomEle = document.getElementById(DomEle);
			break;
		case "object":
			this.DomEle = DomEle;
			break;
	}

var myself=this;

	this.TimerFunc();

	return 0;
}

var gMLXGetBrowser = new MLXGetBrowser();
var gCurrDDEle = null, gOldMouseX=0, gOldMouseY=0; // required by ShBox
