

 (function () {

 NC.widget.CategoryManager = function() {
	/* private variables and methods */
 	var categorydoc = null;
  	var categoryRoot = null;
 	var tree = null;
 	var treeDiv = null;
 	var selectedCategory = -1;
 	var selectedCategoryName = '';
 	var isShown = false;
	var onSelect = null; // function to be called on selection
 	
 	 	return {
 	 		/* public methods */
			StrNode: 		"node",
			StrId: 			"id",
			StrName: 		"name",
			StrChildren: 	"children",
 	 		
 	 		getSelectedCategory: function() {
 	 			return  selectedCategory;
 	 		},

 	 		getSelectedCategoryName: function() {
 	 			return  selectedCategoryName;
 	 		},
			
 	 		isBrowserShown: function() {
 	 			return isShown;
 	 		},
 	 		
 	 		hideCategoryBrowser: function() {
 	 			
 	 		},
 	 		
 	 		ignoreSearchResultsCallback: function() {
 	 			// nop nothing to be done
 	 		},
 	 		
 	 		showCategoryBrowser: function( divId, _onSelect, belowElementId) {
				var leftX = -1;
				var topY = -1;
				if (typeof belowElementId != 'undefined') {
					var belowEl = document.getElementById( belowElementId);
					var region = NC.util.Region.getRegion( belowEl);
					leftX = region.left+3;
					topY = region.bottom;
				}
				onSelect = _onSelect;
				var callback =
				{
	  				cancel:this.ignoreSearchResultsCallback
	  			};
				NC.widget.MessageManager.showDialog('ncfunc:showcategorybrowser', "NCCategoryWrapper", callback, true, 300, leftX, topY);
 	 		},
 	 		
 	 		showCategoryTree: function( wrapperId, contentId ) {
				var wrapperDiv = document.getElementById( wrapperId);
				var contentDiv = document.getElementById( contentId);
				NC.util.Dom.setClassName( contentDiv, 'dialog');
//				var titleDiv = document.createElement( 'h2');
//				titleDiv.innerHTML = "Select Profession";
//				contentDiv.appendChild( titleDiv);
			 	var treeDiv = document.createElement('div');
			 	treeDiv.id = contentId + '_tree';
	 			contentDiv.appendChild(treeDiv);
				
				var callback =
				{
	  				success:function( o) {
					    	categorydoc = o.responseXML;
					    	var content = '';
							//instantiate the tree:
							tree = new NC.widget.TreeView(treeDiv.id);
					    	content = this.traverse( categorydoc.documentElement, content, tree, tree.getRoot());
						    tree.subscribe("labelClick", function(node) { 
						    	if (!node.hasChildren()) {
//					              alert(node.label + "  was selected"); 
					              selectedCategory = node.categoryId;
					              selectedCategoryName = node.label;
					              NC.widget.MessageManager.hideDialog();
					              isShown = false;
					              var nameEl = document.getElementById('PrimaryCategoryName');
								  if (nameEl != null) {
								  	nameEl.value = selectedCategoryName;
								  }
					              var idEl = document.getElementById( 'PrimaryCategory');
								  if (idEl != null) {
								  	idEl.value = selectedCategory;
								  }
								  if (onSelect != null) {
								  	onSelect(selectedCategoryName, selectedCategory);
								  }
						    	}
								else {
									if (node.childrenRendered && node.categoryId != -2) {
							              selectedCategory = node.categoryId;
							              selectedCategoryName = node.label;
							              NC.widget.MessageManager.hideDialog();
							              isShown = false;
							              var nameEl = document.getElementById('PrimaryCategoryName');
										  if (nameEl != null) {
										  	nameEl.value = selectedCategoryName;
										  }
							              var idEl = document.getElementById( 'PrimaryCategory');
										  if (idEl != null) {
										  	idEl.value = selectedCategory;
										  }
										  if (onSelect != null) {
										  	onSelect(selectedCategoryName, selectedCategory);
										  }
									}
								}
							}); 
					    	tree.getRoot().expand();
					    	if (categoryRoot != null) {
					    		categoryRoot.expand();
					    	}
					    	tree.draw();
					 		// position
//					 		var widthX = 250;
//					 		var heightY = 300;
//							treeDiv.style.width= widthX + "px";
					    	isShown = true;
	  				},
	  				failure:function( o) {
	  				},
				scope: this    				
				};
				/*
	 			*/
				var connection = new NC.util.AjaxConnection( 'GET', 'getCategoryXml.php', null);
				connection.executeMethod( callback);


	 		},
	 		
			traverse: function(xmlNode, content, tree, rootNode) {
		        if(xmlNode.hasChildNodes()) {
		        	var value = '';
		        	if (xmlNode.firstChild != null){
		        		value = xmlNode.firstChild.nodeValue;
		        	}
//	                content += xmlNode.nodeName + '(' + xmlNode.nodeType + ')' + ' = ' + value + ' | ';
	                if (xmlNode.nodeName == NC.widget.CategoryManager.StrNode) {
						var tmpNode = new NC.widget.MenuNode("tmp", rootNode, false);
	                	if (rootNode == tree.getRoot()) {
	                		categoryRoot = tmpNode;
							var allNode = new NC.widget.MenuNode("tmp", categoryRoot, false);
			                allNode.setUpLabel( 'Any');
			                allNode.data.categoryId = -1;
			                allNode.categoryId = -1;
	                	}
	                	rootNode = tmpNode;
	                }
	                var categoryName = '';
	                var categoryId = '';
	                for(var i=0; i < xmlNode.childNodes.length; i++) {
	                	var child = xmlNode.childNodes.item(i);
	                	if (child.nodeName == NC.widget.CategoryManager.StrName) {
	                		categoryName = child.firstChild.nodeValue ;
	                	}
	                	if (child.nodeName == NC.widget.CategoryManager.StrId) {
	                		categoryId = child.firstChild.nodeValue ;
	                	}
	                    content = this.traverse(child, content, tree, rootNode);
	                }
	                rootNode.setUpLabel( categoryName);
	                rootNode.data.categoryId = categoryId;
	                rootNode.categoryId = categoryId;
		        }
			    return content;
			}
	 			 		
 	 	}
  }	
();

})(); 	
 
