




var dom = {
	is_descendant: function (desc, asc) {
		while (desc && desc != asc && desc.nodeName != 'BODY' && desc.parentNode) {
			desc = desc.parentNode;
		}
		return (desc == asc);
	},

	move_children: function (from, to) {
		var children = new Array(from.childNodes.length);
		var i;
		for (i = from.childNodes.length - 1; i >= 0; i--) {
			children[i] = from.childNodes[i];
		}
		for (i = 0; i < children.length; i++) {
			to.appendChild(children[i]);
		}
	},

	get_children_by_tag_name: function (el, tag) {
		var children = new Array();
		var c = 0;
		var n, i;
		tag = tag.toUpperCase();
		for (i = 0; i < el.childNodes.length; i++) {
			n = el.childNodes[i];
			if (n.nodeType == 1 && n.nodeName == tag) {
				children[c++] = n;
			}
		}
		return children;
	}
};

var className = {
	has: function (el, cn) {
		if (!el || typeof cn != 'string') {
			return false;
		}
		return (el.className.search(new RegExp('\\b' + cn + '\\b')) != -1);
	},

	add: function (el, cn) {
		if (!el || typeof cn != 'string') {
			return false;
		}
		if (!this.has(el, cn)) {
			el.className += ' ' + cn;
		}
		return true;
	},

	remove: function (el, cn) {
		var c;
		if (!el || typeof cn != 'string') {
			return false;
		}
		if (this.has(el, cn)) {
			c = el.className.replace(new RegExp('\\b' + cn + '\\b'), '');
			c = c.replace(/^ +| +$/g, ''); /* is all this */
			c = c.replace(/ {2,}/g, ' ');  /* necessary?  */
			el.className = c;
		}
		return true;
	},

	toggle: function (el, cn) {
		if (!el || typeof cn != 'string') {
			return false;
		}
		if (hasClass(el, cn)) {
			removeClass(el, cn);
		}
		else {
			addClass(el, cn);
		}
		return true;
	},

	getElementsByClassName: function (root, tag, cn) {
		var list = new Array();
		var l = 0;
		var els, i;
		if (!root || !tag || typeof cn != 'string') {
			return null;
		}
		els = root.getElementsByTagName(tag);
		for (i = els.length - 1; i >= 0; i--) {
			if (this.has(els[i], cn)) {
				list[l++] = els[i];
			}
		}
		return list.reverse();
	}
};

var show_on_mouseover = {
	init: function (element_list, cn, hide_delay, onshow, onhide, mouseover_list) {
		var data = {
			current: null,
			className: cn,
			onshow: onshow,
			onhide: onhide,
			timeout: null
		};
		var el, i;
		if (!dom || !className) {
			return;
		}
		if (!element_list || typeof cn != 'string') {
			return;
		}
		if (mouseover_list && element_list.length != mouseover_list.length) {
			return;
		}
		for (i = element_list.length - 1; i >= 0; i--) {
			el = element_list[i];
			el.show_on_mouseover_data = data;
			el.show_on_mouseover_hide_delay = (typeof hide_delay == 'number') ? hide_delay : hide_delay[i];
			if (mouseover_list) {
				el.show_on_mouseover_over = mouseover_list[i];
			}
			el.onmouseover = this.mouseover;
			el.onmouseout = this.mouseout;
		}
	},

	uninit: function (element_list) {
		var el, i;
		if (!element_list) {
			return;
		}
		for (i = element_list.length - 1; i >= 0; i--) {
			el = element_list[i];
			el.show_on_mouseover_data = el.show_on_mouseover_over = el.onmouseover = el.onmouseout = null;
		}
	},

	hide_now: function (element_list) {
		var data;
		if (!element_list) {
			return;
		}
		data = element_list[0].show_on_mouseover_data;
		if (data.timeout) {
			clearTimeout(data.timeout);
			data.timeout = null;
		}
		this.hide(data);
	},

	mouseover: function (e) {
		var data = this.show_on_mouseover_data;
		var from, to, over;
		if (!e) {
			e = window.event;
		}
		from = (e.relatedTarget) ? e.relatedTarget : e.fromElement;
		to = (e.target) ? e.target : e.srcElement;
		over = (this.show_on_mouseover_over) ? this.show_on_mouseover_over : this;
		if (data.current == this) {
			if (!dom.is_descendant(from, this) && dom.is_descendant(to, this)) {
				if (data.timeout) {
					clearTimeout(data.timeout);
					data.timeout = null;
				}
			}
		}
		else {
			if (!dom.is_descendant(from, over) && dom.is_descendant(to, over)) {
				if (data.timeout) {
					clearTimeout(data.timeout);
					data.timeout = null;
				}
				show_on_mouseover.hide(data);
				if (data.onshow) {
					data.onshow(this);
				}
				className.add(this, data.className);
				/* hack */
				var els = dom.get_children_by_tag_name(this, 'iframe');
				if (els.length > 0) {
					els[0].style.height = els[0].menu.offsetHeight + 'px';
				}
				/* end hack */
				data.current = this;
			}
		}
	},

	mouseout: function (e) {
		var data = this.show_on_mouseover_data;
		var from, to;
		if (!e) {
			e = window.event;
		}
		from = (e.target) ? e.target : e.srcElement;
		to = (e.relatedTarget) ? e.relatedTarget : e.toElement;
		if (dom.is_descendant(from, this) && !dom.is_descendant(to, this)) {
			if (data.current) {
				data.timeout = setTimeout(function () { show_on_mouseover.hide(data); data.timeout = null; }, this.show_on_mouseover_hide_delay);
			}
		}
	},

	hide: function (data) {
		if (data.current) {
			if (data.onhide) {
				data.onhide(data.current);
			}
			className.remove(data.current, data.className);
			data.current = null;
		}
	}
};

var headerNav = {
	menuContainers: null,
	subMenuContainers: null,

	menuMouseOver: function (li) {
		li.button.src = li.button.src.replace('_off_', '_on_');
	},

	menuMouseOut: function (li) {
		li.button.src = li.button.src.replace('_on_', '_off_');
		if (headerNav.subMenuContainers) {
			show_on_mouseover.hide_now(headerNav.subMenuContainers);
		}
	},

	subMenuMouseOver: function (li) {
		className.add(li.link, 'open');
	},

	subMenuMouseOut: function (li) {
		className.remove(li.link, 'open');
	},

	init: function () {
		var nav, container, links, delays, menu, iframe, els, i;
		els = className.getElementsByClassName(document, 'ul', 'headerNav');
		if (els && els.length > 0) {
			nav = els[0];
			this.menuContainers = dom.get_children_by_tag_name(nav, 'li');
			delays = new Array(this.menuContainers.length);
			this.subMenuContainers = new Array();
			for (i = this.menuContainers.length - 1; i >= 0; i--) {
				container = this.menuContainers[i];
				this.menuContainers[i].button = dom.get_children_by_tag_name(dom.get_children_by_tag_name(container, 'a')[0], 'img')[0];
				els = dom.get_children_by_tag_name(container, 'div');
				if (els.length > 0) {
					delays[i] = 500;
					menu = els[0];

					/*@cc_on @*/
					/*@if (@_jscript_version <= 5.6)
					iframe = document.createElement('iframe');
					iframe.menu = menu;
					container.appendChild(iframe);
					@end @*/

					this.subMenuContainers = this.subMenuContainers.concat(dom.get_children_by_tag_name(dom.get_children_by_tag_name(menu, 'ul')[0], 'li'));
				}
				else {
					delays[i] = 0;
				}
			}
			show_on_mouseover.init(this.menuContainers, 'headerNavMenuOpen', delays, this.menuMouseOver, this.menuMouseOut);

			links = new Array(this.subMenuContainers.length);
			delays = new Array(this.subMenuContainers.length);
			for (i = this.subMenuContainers.length - 1; i >= 0; i--) {
				container = this.subMenuContainers[i];
				links[i] = dom.get_children_by_tag_name(container, 'a')[0];
				container.link = links[i];
				els = dom.get_children_by_tag_name(container, 'ul');
				if (els.length > 0) {
					delays[i] = 500;

					/*@cc_on @*/
					/*@if (@_jscript_version <= 5.6)
					menu = els[0];
					iframe = document.createElement('iframe');
					if (className.has(menu, 'headerNavRightSubMenu')) {
						iframe.className = 'right';
					}
					iframe.menu = menu;
					container.appendChild(iframe);
					@end @*/
				}
				else {
					delays[i] = 0;
				}
			}
			show_on_mouseover.init(this.subMenuContainers, 'headerNavMenuOpen', delays, this.subMenuMouseOver, this.subMenuMouseOut, links);
		}
	},

	uninit: function () {
		var i;
		if (this.menuContainers) {
			show_on_mouseover.uninit(this.menuContainers);
			for (i = this.menuContainers.length - 1; i >= 0; i--) {
				this.menuContainers[i].button = null;
			}
		}
		if (this.subMenuContainers) {
			show_on_mouseover.uninit(this.subMenuContainers);
			for (i = this.subMenuContainers.length - 1; i >= 0; i--) {
				this.subMenuContainers[i].link = null;
			}
		}
	}
};
