
/*
	cpMenuTree.js
	Chris Petersen 2005

	W3C DOM Level 2 Compatible Menu Interface for JavaScript
*/


// functions

function cpmtMenuEventActivate( e ) {

	document.cpmtMenu.ActivateItem( this.cpmtMenuPath );
}

function cpmtMenuEventDeactivate( e ) {

	document.cpmtMenu.DeactivateItem( this.cpmtMenuPath );
}

function cpmtMenuThreadDeactivate( sMenuPath, nDeactivateCount ) { // function for class cpmtMenu

	var nCount = 0;
	var aItemName = sMenuPath.split( "-" );
	var sMenuName = aItemName.shift();
	for (nCount = 0; nCount < document.cpmtMenu.Menus.length; nCount++) {
		var oMenu = document.cpmtMenu.Menus[ nCount ];
		if (oMenu.Path == sMenuName) {
			if (oMenu.ActiveItem === null) {
				if (nDeactivateCount == 0) {
					oMenu.DeactivateAll();
				} else {
					window.setTimeout("cpmtMenuThreadDeactivate(\"" + sMenuName + "\", " + String( --nDeactivateCount ) + ")", oMenu.ContainerCloseDelay );
				}
			}
		}
	}
}

// classes

function cpmtGenerator() { // class

	this.Element = null;
	this.ParentMenuItem = null;
}

function cpmtContainer() { // class

	this.Element = null;
	this.ParentMenuItem = null;
}

function cpmtMenuItemActivateItem( sItemName ) { // function for class cpmtMenuItem

	var nCount = 0;
	for (nCount = 0; nCount < this.Containers.length; nCount++) {
		this.Containers[ nCount ].Element.className = this.SuperParentMenu().ContainerStyleClassSelected;
	}
	if (sItemName != "") {
		var aItemName = sItemName.split( "-" );
		var sMenuItemName = aItemName.shift();
		var sSubItemName = "";
		if (aItemName.length > 0) sSubItemName = aItemName.join( "-" );
		for (nCount = 0; nCount < this.MenuItems.length; nCount++) {
			var oItem = this.MenuItems[ nCount ];
			if (oItem.Path == (this.Path + "-" + sMenuItemName)) oItem.ActivateItem( sSubItemName );
			else oItem.DeactivateItemFast();
		}
	} else {
		this.SuperParentMenu().ActiveItem = this;
		for (nCount = 0; nCount < this.MenuItems.length; nCount++) this.MenuItems[ nCount ].DeactivateItemFast();
	}
}

function cpmtMenuItemDeactivateItem( sItemName ) { // function for class cpmtMenuItem

	oSuper = this.SuperParentMenu();
	if (sItemName != "") {
		var aItemName = sItemName.split( "-" );
		var sMenuItemName = aItemName.shift();
		var sSubItemName = "";
		if (aItemName.length > 0) sSubItemName = aItemName.join( "-" );
		for (nCount = 0; nCount < this.MenuItems.length; nCount++) {
			var oItem = this.MenuItems[ nCount ];
			if (oItem.Path == (this.Path + "-" + sMenuItemName)) oItem.DeactivateItem( sSubItemName );
		}
	} else {
		oSuper.ActiveItem = null;
		cpmtMenuThreadDeactivate( oSuper.Path, oSuper.ContainerCloseDelayCount );
	}
}

function cpmtMenuItemDeactivateItemFast() { // function for class cpmtMenuItem

	var nCount = 0;
	for (nCount = 0; nCount < this.Containers.length; nCount++) this.Containers[ nCount ].Element.className = this.SuperParentMenu().ContainerStyleClassNormal;
}

function cpmtMenuItemSuperParentMenu() { // function for class cpmtMenuItem

	return this.ParentMenuItem.SuperParentMenu();
}

function cpmtMenuItemGenerateEventHandlers() { // function for class cpmtMenuItem

	var nCount = 0;
	for (nCount = 0; nCount < this.Generators.length; nCount++) {
		this.Generators[ nCount ].Element.onmouseover = cpmtMenuEventActivate;
		this.Generators[ nCount ].Element.onfocus = cpmtMenuEventActivate;
		this.Generators[ nCount ].Element.onmouseout = cpmtMenuEventDeactivate;
		this.Generators[ nCount ].Element.onblur = cpmtMenuEventDeactivate;
	}
	for (nCount = 0; nCount < this.MenuItems.length; nCount++) this.MenuItems[ nCount ].GenerateEventHandlers();
}

function cpmtMenuItemLoadHTMLMenuItems( oHTML ) { // function for class cpmtMenuItem
	var nCount = 0;
	for (nCount = 0; nCount < oHTML.childNodes.length; nCount++) {
		var oHTMLNode = oHTML.childNodes[ nCount ];
		if (oHTMLNode.nodeType == 1) {
			if (oHTMLNode.className == "cpmtMenuItem") {
				var oNew = new cpmtMenuItem();
				oNew.Path = this.Path + "-" + String( this.MenuItems.length );
				oNew.Element = oHTML.childNodes[ nCount ];
				oNew.ParentMenuItem = this;
				this.MenuItems.push( oNew );
			} else if (oHTMLNode.className == "cpmtContainer") {
				var oNew = new cpmtContainer();
				oNew.Element = oHTML.childNodes[ nCount ];
				oNew.ParentMenuItem = this;
				this.Containers.push( oNew );
				if ( oHTMLNode.hasChildNodes() ) this.LoadHTMLMenuItems( oHTMLNode );
			} else if (oHTMLNode.className == "cpmtGenerator") {
				var oNew = new cpmtGenerator();
				oNew.Element = oHTML.childNodes[ nCount ];
				oNew.Element.cpmtMenuPath = this.Path;
				oNew.ParentMenuItem = this;
				this.Generators.push( oNew );
				if ( oHTMLNode.hasChildNodes() ) this.LoadHTMLMenuItems( oHTMLNode );
			} else if (oHTMLNode.className != "cpmtMenu") {
				if ( oHTMLNode.hasChildNodes() ) this.LoadHTMLMenuItems( oHTMLNode );
			}
		}
	}
}

function cpmtMenuItemLoadItems() { // function for class cpmtMenuItem
	
	if (this.Element !== null) {
		this.MenuItems = new Array();
		this.ActiveItem = null;
		this.LoadHTMLMenuItems( this.Element );
		var nCount = 0;
		for (nCount = 0; nCount < this.MenuItems.length; nCount++) this.MenuItems[ nCount ].LoadItems();
	}
}

function cpmtMenuItem() { // class

	this.Path = "";
	this.Element = null;
	this.ParentMenuItem = null;
	this.Generators = new Array();
	this.Containers = new Array();
	this.MenuItems = new Array();

	this.ActivateItem = cpmtMenuItemActivateItem;
	this.DeactivateItem = cpmtMenuItemDeactivateItem;
	this.DeactivateItemFast = cpmtMenuItemDeactivateItemFast;
	this.SuperParentMenu = cpmtMenuItemSuperParentMenu;
	this.GenerateEventHandlers = cpmtMenuItemGenerateEventHandlers;
	this.LoadHTMLMenuItems = cpmtMenuItemLoadHTMLMenuItems;
	this.LoadItems = cpmtMenuItemLoadItems;
}

function cpmtMenuSuperParentMenu() { // function for class cpmtMenu

	return this;
}

function cpmtMenuGenerateEventHandlers() { // function for class cpmtMenu

	var nCount = 0;
	for (nCount = 0; nCount < this.MenuItems.length; nCount++) this.MenuItems[ nCount ].GenerateEventHandlers();
}

function cpmtMenuLoadHTMLMenuItems( oHTML ) { // function for class cpmtMenu

	var nCount = 0;
	for (nCount = 0; nCount < oHTML.childNodes.length; nCount++) {
		var oHTMLNode = oHTML.childNodes[ nCount ];
		if (oHTMLNode.nodeType == 1) {
			if (oHTMLNode.className == "cpmtMenuItem") {
				var oNew = new cpmtMenuItem();
				oNew.Path = this.Path + "-" + String( this.MenuItems.length );
				oNew.Element = oHTMLNode;
				oNew.ParentMenuItem = this;
				this.MenuItems.push( oNew );
			} else if (oHTMLNode.className != "cpmtMenu") {
				if ( oHTMLNode.hasChildNodes() ) this.LoadHTMLMenuItems( oHTMLNode );
			}
		}
	}
}

function cpmtMenuLoadItems() { // function for class cpmtMenu

	if (this.Element !== null) {
		this.MenuItems = new Array();
		this.ActiveItem = null;
		this.LoadHTMLMenuItems( this.Element );
		var nCount = 0;
		for (nCount = 0; nCount < this.MenuItems.length; nCount++) this.MenuItems[ nCount ].LoadItems();
		this.GenerateEventHandlers();
		this.DeactivateAll();
	}
}

function cpmtMenuActivateItem( sItemName ) { // function for class cpmtMenu

	if (sItemName != "") {
		var aItemName = sItemName.split( "-" );
		var sMenuItemName = aItemName.shift();
		var sSubItemName = "";
		if (aItemName.length > 0) sSubItemName = aItemName.join( "-" );
		var nCount = 0;
		for (nCount = 0; nCount < this.MenuItems.length; nCount++) {
			if (this.MenuItems[ nCount ].Path == (this.Path + "-" + sMenuItemName)) this.MenuItems[ nCount ].ActivateItem( sSubItemName );
			else this.MenuItems[ nCount ].DeactivateItemFast( sSubItemName );
		}
	}
}

function cpmtMenuDeactivateItem( sItemName ) { // function for class cpmtMenu

	if (sItemName != "") {
		var aItemName = sItemName.split( "-" );
		var sMenuItemName = aItemName.shift();
		var sSubItemName = "";
		if (aItemName.length > 0) sSubItemName = aItemName.join( "-" );
		var nCount = 0;
		for (nCount = 0; nCount < this.MenuItems.length; nCount++) if (this.MenuItems[ nCount ].Path == (this.Path + "-" + sMenuItemName)) this.MenuItems[ nCount ].DeactivateItem( sSubItemName );
	}
}

function cpmtMenuDeactivateAll() { // function for class cpmtMenu

	var nCount = 0;
	for (nCount = 0; nCount < this.MenuItems.length; nCount++) this.MenuItems[ nCount ].DeactivateItemFast();
	this.ActiveItem = null;
}

function cpmtMenu() { // class

	this.Path = "";
	this.Element = null;
	this.ParentLoader = null;
	this.ActiveItem = null;
	this.MenuItems = new Array();
	this.ContainerStyleClassNormal = "normal";
	this.ContainerStyleClassSelected = "selected";
	this.ContainerCloseDelay = 500;
	this.ContainerCloseDelayCount = 1;

	this.SuperParentMenu = cpmtMenuSuperParentMenu;
	this.GenerateEventHandlers = cpmtMenuGenerateEventHandlers;
	this.LoadHTMLMenuItems = cpmtMenuLoadHTMLMenuItems;
	this.LoadItems = cpmtMenuLoadItems;
	this.ActivateItem = cpmtMenuActivateItem;
	this.DeactivateItem = cpmtMenuDeactivateItem;
	this.DeactivateAll = cpmtMenuDeactivateAll;
}

function cpmtMenuLoaderLoadHTMLMenus( oHTML ) { // function for class cpmtMenuLoader
	var nCount = 0;
	for (nCount = 0; nCount < oHTML.childNodes.length; nCount++) {
		var oHTMLNode = oHTML.childNodes[ nCount ];
		if (oHTMLNode.nodeType == 1) {
			if (oHTMLNode.className == "cpmtMenu") {
				var oNew = new cpmtMenu();
				oNew.Path = String( this.Menus.length );
				oNew.Element = oHTMLNode;
				oNew.ParentLoader = this;
				this.Menus.push( oNew );
			}
			if ( oHTMLNode.hasChildNodes() ) this.LoadHTMLMenus( oHTMLNode );
		}
	}
}

function cpmtMenuLoaderLoadMenus() { // function for class cpmtMenuLoader
	
	if (document.body !== null) {
		this.Menus = new Array();
		this.LoadHTMLMenus( document.body );
		var nCount = 0;
		for (nCount = 0; nCount < this.Menus.length; nCount++) this.Menus[ nCount ].LoadItems();
	}
}

function cpmtMenuLoaderActivateItem( sItemName ) { // function for class cpmtMenuLoader

	var aItemName = sItemName.split( "-" );
	var sMenuName = aItemName.shift();
	var sSubItemName = aItemName.join( "-" );
	var nCount = 0;
	for (nCount = 0; nCount < this.Menus.length; nCount++) if (this.Menus[ nCount ].Path == sMenuName) this.Menus[ nCount ].ActivateItem( sSubItemName );
}

function cpmtMenuLoaderDeactivateItem( sItemName ) { // function for class cpmtMenuLoader

	var aItemName = sItemName.split( "-" );
	var sMenuName = aItemName.shift();
	var sSubItemName = aItemName.join( "-" );
	var nCount = 0;
	for (nCount = 0; nCount < this.Menus.length; nCount++) if (this.Menus[ nCount ].Path == sMenuName) this.Menus[ nCount ].DeactivateItem( sSubItemName );
}

function cpmtMenuLoader() { // class

	this.Menus = new Array();

	this.LoadHTMLMenus = cpmtMenuLoaderLoadHTMLMenus;
	this.LoadMenus = cpmtMenuLoaderLoadMenus;
	this.ActivateItem = cpmtMenuLoaderActivateItem;
	this.DeactivateItem = cpmtMenuLoaderDeactivateItem;

	this.LoadMenus();
}


// user functions

function cpmtMenuLoad() {

	oNew = new cpmtMenuLoader();
	document.cpmtMenu = oNew;
}

