// menu.js
// -------
addEvent(window, 'load', function(){Menu.init('nav')});

// sinusoidal easing out - decelerating to zero velocity
Math.easeOutSine = function(t,b,c,d){
	return c*Math.sin(t/d*(Math.PI/2))+b;
}

Tween = {
	onComplete: [],

	resizeTo: function(id, endH, duration, fn, startH, startTime)
	{
		var obj = document.getElementById(id);

		if(!startH) var startH = obj.offsetHeight;
		if(!startTime) var startTime = new Date().getTime();

		var elapsed	= new Date().getTime() - startTime;

		if (elapsed < duration){
			obj.style.height = Math.easeOutSine(elapsed,startH,(endH-startH),duration) + 'px';
			setTimeout('Tween.resizeTo("'+ id +'",'+ endH +','+ duration +','+ fn +','+ startH +','+ startTime +')',0);
		}
		else{
			obj.style.height = endH + 'px';
			if (fn) eval(Tween.onComplete[id]);
		}
	}
}

Menu = {
	current: null,
	orig_height: [],

	toggle:function(){
		var p = this.parentNode;
		var o = p.getElementsByTagName('UL')[0];
		var delay = 0;
		if(p.className.indexOf('smopen') > -1){ // close
			var h = 0;
			Tween.onComplete[o.id] = 'Menu.current = null';
			var fn = true;
		}
		else{ // open
			var h = Menu.orig_height[o.id.replace('ul','')];
			var fn = false;
			if(Menu.current){ // close any currently open menu items
				var u = Menu.current;
				var l = u.parentNode;
				delay = 100;
				Tween.onComplete[u.id] = 'if(Menu.current.id == "'+ u.id +'")Menu.current = null';
				Tween.resizeTo(u.id, 0, 150, true);
				l.className = l.className.indexOf('smopen') > -1 ? l.className.replace('smopen','smclosed') : l.className.replace('smclosed','smopen');
			}
			Menu.current = o;
		}
		this.blur();
		p.className = p.className.indexOf('smopen') > -1 ? p.className.replace('smopen','smclosed') : p.className.replace('smclosed','smopen');
		return !setTimeout('Tween.resizeTo("'+ o.id +'",'+ h +',200,'+ fn +')',delay);
	},

	init:function(id){
		var bid = document.body.id.replace('m','').split('-');
		var ul = document.getElementById(id);
		var li = [], tmpli = ul.childNodes;

		for(var i = 0; i < tmpli.length; i++) if(tmpli[i].tagName == 'LI') li.push(tmpli[i]);

		for(var i = 0; i < li.length; i++){

			var sul = li[i].getElementsByTagName('UL');

			if(sul.length > 0){
				var indx = Menu.orig_height.push(sul[0].offsetHeight) - 1;

				sul[0].id = 'ul' + indx;
				li[i].getElementsByTagName('A')[0].onclick = Menu.toggle;

				if(bid[0]-1 == i){
					li[i].className = 'smopen selected';
					Menu.current = sul[0];
					sul[0].style.height = Menu.orig_height[indx] + 'px';

					if(bid[1] > 0){
						var sli = [], tmpsli = sul[0].childNodes;
						for(var j = 0; j < tmpsli.length; j++) if(tmpsli[j].tagName == 'LI') sli.push(tmpsli[j]);
						sli[bid[1]-1].className = 'selected';
						// Third Level
						var slili = sli[bid[1]-1].getElementsByTagName('LI');
						if(slili.length > 0 && bid[2]){
								slili[0].parentNode.style.height = 'auto';
								var pul = slili[0].parentNode.parentNode.parentNode;
								pul.style.height = 'auto';
								Menu.orig_height[pul.id.replace('ul','')] = pul.offsetHeight;
								if(bid[2] > 0) slili[bid[2]-1].className = 'selected';
						}
					}
				}
				else li[i].className = 'smclosed';
			}
			else if(bid[0]-1 == i) li[i].className = 'selected';
		}

		// prevent accidental selection of menu text
		var disabletext = function(e){ return!hasParent(e.target,id) }
		if(/MSIE/.test(navigator.userAgent)) ul.onselectstart = disabletext;
		else document.onmousedown = disabletext;
	}
}

function hasParent(o,id) {
	if (o == null) return false;
	else if (o.nodeType == 1 && o.id == id) return true;
	else if (o.parentNode != null) return hasParent(o.parentNode,id);
	else return false;
}
// emulates push for browsers that don't support it (Mac IE)
Array.prototype.push = function(e) {
	this[this.length] = e;
	return this.length;
}


/*** other misc functions ***/
function chkField(e) {
	if ((e.value== null) || (e.value== "") || isblank(e.value) || (e.value.length== 0 )) {
		return false;
	}
	else {
		return true;
	}
}
///
///
///
// Function that returns true if a string contains only white space
function isblank(s) {
	for (var i=0; i < s.length; i++) {
		var c=s.charAt(i);
		if ((c != " ") && (c != '\n') && (c != '\t')) return false;
	}
	return true;
}
///
///
///
function isNumber(sText)
{
   var ValidChars = "0123456789.";
   var isNumber=true;
   var Char;
   //
   for (i = 0; i < sText.length && isNumber == true; i++)
      {
      Char = sText.charAt(i);
      if (ValidChars.indexOf(Char) == -1)
         {
         isNumber = false;
         }
      }
   return isNumber;
   }

function MM_jumpMenu(targ,selObj,restore){ //v3.0
  eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
  if (restore) selObj.selectedIndex=0;
}

// written by Dean Edwards, 2005
// http://dean.edwards.name/
function addEvent(element, type, handler) {
	// assign each event handler a unique ID
	if (!handler.$$guid) handler.$$guid = addEvent.guid++;
	// create a hash table of event types for the element
	if (!element.events) element.events = {};
	// create a hash table of event handlers for each element/event pair
	var handlers = element.events[type];
	if (!handlers) {
		handlers = element.events[type] = {};
		// store the existing event handler (if there is one)
		if (element["on" + type]) {
			handlers[0] = element["on" + type];
		}
	}
	// store the event handler in the hash table
	handlers[handler.$$guid] = handler;
	// assign a global event handler to do all the work
	element["on" + type] = handleEvent;
};
// a counter used to create unique IDs
addEvent.guid = 1;

function removeEvent(element, type, handler) {
	// delete the event handler from the hash table
	if (element.events && element.events[type]) {
		delete element.events[type][handler.$$guid];
	}
};

function handleEvent(event) {
	// grab the event object (IE uses a global event object)
	event = event || window.event;
	// get a reference to the hash table of event handlers
	var handlers = this.events[event.type];
	// execute each event handler
	for (var i in handlers) {
		this.$$handleEvent = handlers[i];
		this.$$handleEvent(event);
	}
};
