function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}


function MM_validateForm() { //v4.0
  var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments;
  for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=MM_findObj(args[i]);
    if (val) { nm=val.name; if ((val=val.value)!="") {
      if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@');
        if (p<1 || p==(val.length-1)) errors+='- '+nm+' must contain an e-mail address.\n';
      } else if (test!='R') { num = parseFloat(val);
        if (isNaN(val)) errors+='- '+nm+' must contain a number.\n';
        if (test.indexOf('inRange') != -1) { p=test.indexOf(':');
          min=test.substring(8,p); max=test.substring(p+1);
          if (num<min || max<num) errors+='- '+nm+' must contain a number between '+min+' and '+max+'.\n';
    } } } else if (test.charAt(0) == 'R') errors += '- '+nm+' is required.\n'; }
  } if (errors) alert('The following error(s) occurred:\n'+errors);
  document.MM_returnValue = (errors == '');
}

/* *** config *** */
var cfgNavigationID = "topnavigation";
var cfgNavigationMenuLIClass = "menu_li"
var cfgNavigationToplevelItemsClass = "toplevel";
var cfgSubmenuClass = "submenu";
var cfgSubmenuPadding = 20;
var cfgSubmenuOffset = 47;
var cfgAddedWidth = 60;

/* *** global variables *** */
var __, oTopnavigationDropdownhandler;

/* *** onload *** */
function scrOnload(){
	oTopnavigationDropdownhandler = new tmlibSuckerfish({"menuID":cfgNavigationID,"wrapperClass":cfgNavigationMenuLIClass,"toplevelClass":cfgNavigationToplevelItemsClass,"submenuClass":cfgSubmenuClass, "submenuPadding":cfgSubmenuPadding, "submenuOffset": cfgSubmenuOffset, "addedWidth": cfgAddedWidth});
	oTopnavigationDropdownhandler.sizeAndCenter();
}

/* ----------- tmlib ------------ */
/* *********
TMlib suckerfish
*********** */
function tmlibSuckerfish(arguments){
	this.menuID = (arguments.meniID)? arguments.menuID : "topnavigation";
	this.wrapperClass = (arguments.wrapperClass)? arguments.wrapperClass : "menu_li";
	this.toplevelClass = (arguments.toplevelClass)? arguments.toplevelClass : "toplevel";
	this.submenuClass = (arguments.submenuClass)? arguments.submenuClass : "submenu";
	this.doSizeAndCenter = (arguments.doSizeAndCenter)? arguments.doSizeAndCenter : 0;
	this.submenuPadding = (arguments.submenuPadding)? arguments.submenuPadding : 0;
	this.submenuOffset = (arguments.submenuOffset)? arguments.submenuOffset : 0;
	this.addedWidth = (arguments.addedWidth)? arguments.addedWidth : 0;
	
	this.elmMenu = elmMenu = document.getElementById(cfgNavigationID);
	this.elmsWrapper = __.getElementsByClassName({"className": this.wrapperClass, "element": elmMenu});
	this.elmsMenuAssociations = this.getAllMenuPieces();
	this.elmCurrentlySelected = 0;
	
	this.timeout;
	
	this.attachListeners();
}
tmlibSuckerfish.prototype.getAllMenuPieces = function(){
	var fncReturnArray = new Array();
	for(var i=0; i < this.elmsWrapper.length; ++i){
		var forArray = new Array;
		forElmToplevel = __.getElementsByClassName({"className": this.toplevelClass, "element": this.elmsWrapper[i]});
		forElmSubmenu = __.getElementsByClassName({"className": this.submenuClass, "element": this.elmsWrapper[i]});
		fncReturnArray.push({"elmItemWrapper":this.elmsWrapper[i], "elmToplevel":forElmToplevel[0], "elmSubmenu": (forElmSubmenu[0])?forElmSubmenu[0]:null})
	}
	return fncReturnArray;
}
tmlibSuckerfish.prototype.attachListeners = function(){
	var fncThis = this;
	for(i=0;i < this.elmsMenuAssociations.length; ++i){
		var forElmMenuItemArray = this.elmsMenuAssociations[i];
		if(this.elmsMenuAssociations[i]["elmSubmenu"]){
			var callbackFull = function(forElmMenuItemArray, fncThis) {
				return function(){
					clearTimeout(fncThis.timeout);
					if(!(this.elmCurrentlySelected === forElmMenuItemArray["elmItemWrapper"]))
						fncThis.dropdownOpen(forElmMenuItemArray["elmItemWrapper"]);
				}
			}(forElmMenuItemArray, fncThis);
			var callbackMouseout = function(fncThis){
				return function(){
					fncThis.timeout = setTimeout(function(fncThis){ return function(){fncThis.dropdownCloseCurrent(); };}(fncThis) ,750);
				};

			}(fncThis);
			__.addListener(forElmMenuItemArray["elmItemWrapper"], "mouseover", callbackFull, false);
			__.addListener(forElmMenuItemArray["elmToplevel"], "mouseover", callbackFull, false);
			__.addListener(forElmMenuItemArray["elmSubmenu"], "mouseover", callbackFull, false);
			__.addListener(forElmMenuItemArray["elmItemWrapper"], "click", callbackFull, false);
			__.addListener(forElmMenuItemArray["elmItemWrapper"], "touchstart", callbackFull, false);
			__.addListener(forElmMenuItemArray["elmItemWrapper"], "mouseout", callbackMouseout, false);
		}
		// empty menu items
		else{
			var callbackEmpty = function(fncThis){
				return function(){
					fncThis.dropdownCloseCurrent();
				}
			}(fncThis)
			__.addListener(forElmMenuItemArray["elmItemWrapper"], "mouseover", callbackEmpty, false);
			__.addListener(forElmMenuItemArray["elmItemWrapper"], "click", callbackEmpty, false);
			__.addListener(forElmMenuItemArray["elmItemWrapper"], "touchstart", callbackEmpty, false);
		}
	}
}
tmlibSuckerfish.prototype.dropdownOpen = function(argElement){
	if(this.elmCurrentlySelected && this.elmCurrentlySelected !== argElement)
		this.dropdownCloseCurrent();
	if(argElement){
		__.addClass(argElement, "selected");
		this.elmCurrentlySelected = argElement;
	}
}
tmlibSuckerfish.prototype.dropdownCloseCurrent = function(){
	if(this.elmCurrentlySelected){
		__.removeClass(this.elmCurrentlySelected, "selected");
		this.elmCurrentlySelected = 0;
		return 1;
	}
	return 0;
}
tmlibSuckerfish.prototype.dropdownCloseAll = function(){
					for(j=0;j < argElmsMenuArray.length; ++j){
						__.removeClass(argElmsMenuArray[j]["elmItemWrapper"], "selected");
					}
}
/* ***** 
menu sizing
****** */

tmlibSuckerfish.prototype.sizeAndCenter = function(){	
	for(var i=0; i < this.elmsMenuAssociations.length; ++i){
		var forElmMenuItemArray = this.elmsMenuAssociations[i];
		if(forElmMenuItemArray["elmSubmenu"]){
			if(forElmMenuItemArray["elmSubmenu"].offsetWidth < forElmMenuItemArray["elmToplevel"].offsetWidth + this.addedWidth && !__.isIE6()){
				forElmMenuItemArray["elmSubmenu"].style.width = (forElmMenuItemArray["elmToplevel"].offsetWidth + this.addedWidth/*  - this.submenuPadding */) + "px";
			}
			if(forElmMenuItemArray["elmSubmenu"].offsetWidth > forElmMenuItemArray["elmToplevel"].offsetWidth){
				ifOffset = ((forElmMenuItemArray["elmToplevel"].offsetWidth - (forElmMenuItemArray["elmSubmenu"].offsetWidth/*  + this.ubmenuPadding */)) / 2);
				if(__.isIE6()) ifOffset += this.submenuOffset;
				forElmMenuItemArray["elmSubmenu"].style.left = ifOffset+ "px";
			}
		}
	}
}

/* ********* 
library
********* */
function tmlib(){}
tmlib.prototype.addListener = function(argElement, argEvent, argFunction, argBubble){
	var fncBubble = (argBubble)?argBubble : false;
	if(argElement.attachEvent)
		argElement.attachEvent("on"+argEvent, argFunction);
	else
		argElement.addEventListener(argEvent, argFunction, fncBubble);
}
tmlib.prototype.getElementsByClassName = function(args){
	var fncClassName = (args.className)?args.className:null; if(!fncClassName) return;
	var fncElement = (args.element)?args.element:document;
	var fncTagName = (args.tagName)?args.tagName:null;
	
	var fncReturn = [], fncElementsToSearch = [];
	var fncRegex = new RegExp('\\b'+fncClassName+'\\b');
	
	if(fncTagName){
		fncElementsToSearch = fncElement.getElementsByTagName(fncTagName);
	}
	else if(fncElement.all)
		fncElementsToSearch = fncElement.all;
	else
		fncElementsToSearch = fncElement.getElementsByTagName('*');

	for(var i=0; i < fncElementsToSearch.length; ++i){
		if(fncRegex.test(fncElementsToSearch[i].className))
			fncReturn.push(fncElementsToSearch[i]);
	}
	
	return fncReturn;
}
tmlib.prototype.addClass = function(argElement, argClass){
	if(new RegExp('\\b'+argClass+'\\b').test(argElement.className))
		return 0;
	else{
		argElement.className+=argElement.className?' '+argClass:argClass;
		return 1;
	}
}
tmlib.prototype.removeClass = function(argElement, argClass){
      var fncReplace = argElement.className.match(' '+argClass)?' '+argClass:argClass;
      argElement.className=argElement.className.replace(fncReplace,'');
}
tmlib.prototype.hasClass = function(argElement, argClass){
	if(new RegExp('\\b'+argClass+'\\b').test(argElement.className))
		return 1;
	else
		return 0;
}

tmlib.prototype.isIE = function(){
	if(this.isievar)
		return this.isie
	else{
		this.initUA();
		if(this.browser.indexOf("Internet Explorer", 0) == -1) return 1
		else return 0;
	}
}
tmlib.prototype.isIE6 = function(){
	if(this.isIE){
		if(!this.ieversion) // http://www.javascriptkit.com/javatutors/navigator.shtml
			if(/MSIE (\d+\.\d+);/.test(navigator.userAgent))
				this.ieversion = new Number(RegExp.$1) // capture x.x portion and store as a number
		if(this.ieversion == 6)
			return 1;
		else return 0;
	}
	else
		return 0;
}
tmlib.prototype.initUA = function(){
	if(!this.browser) this.browser = navigator.appName;
	if(!this.verion){
		this.version = parseFloat(navigator.appVersion);
	}
}

/* *****
init tmlib
***** */
__ = new tmlib();
__.addListener(window, "load", scrOnload, false);

