// Define content structure
function MenuBuilder() {
}

// General vars
MenuBuilder.prototype.itemList;

// Functions
MenuBuilder.prototype.getSelected = mb_getSelected;
MenuBuilder.prototype.setSelected = mb_setSelected;
MenuBuilder.prototype.getItem = mb_getItem;

MenuBuilder.prototype.isOpened = mb_isOpened;	// Tra ve true neu cung mot nhanh voi selected item va level cao hon (gan level 1 hon)

function mb_getData(obj) {
	try {
		menu_builder.itemList = mb_getItemList(obj.menu, 0, -1);	// start with level 0, parent = -1
	} catch(err){
		alert(err);
	}
}

function mb_getSelected() {
	return mb_findSelected(this.itemList);
}

function mb_setSelected(id) {
	this.itemList = mb_updateSelected(this.itemList, id);
}

function mb_isOpened(id) {
	return mb_checkOpened(this.itemList, id);	
}

function mb_getItem(id) {
	return mb_findItem(this.itemList, id);
}

function mb_getItemList(nodeData, currentLevel, parentId) {
	try
	{
		var result = new Array(nodeData.length);
		for (var i=0; i<nodeData.length; i++)
		{
			result[i] = new Array();
			result[i]["id"] = nodeData[i].id;
			result[i]["title"] = nodeData[i].title;
			result[i]["url"] = nodeData[i].url;
			result[i]["level"] = currentLevel;
			if(parentId != -1)
				result[i]["parent_id"] = parentId;

			if(nodeData[i].item && nodeData[i].item.length > 0)
				result[i]["itemList"] = mb_getItemList(nodeData[i].item, currentLevel+1, nodeData[i].id);
		}
		return result;
	}
	catch (err)
	{
	}
}

function mb_findSelected(itemList) {
	try
	{
		for (var i=0; i<itemList.length; i++)
		{
			if(itemList[i]["selected"] && itemList[i]["selected"] == "true")
				return itemList[i];
			else {
				if(itemList[i]["itemList"] && itemList[i]["itemList"].length > 0) {
					var subResult = mb_findSelected(itemList[i]["itemList"]);
					if(subResult != -1)
						return subResult;
				}
			}
		}
		return -1;
	}
	catch (err)
	{
		return -1;
	}
}

function mb_checkOpened(itemList, item) {
	try
	{
		var selected = mb_findSelected(itemList);
		if(selected == -1)
			return false;
		else {
			var wayFromSelectedToRootItem = new Array();
			wayFromSelectedToRootItem[0] = selected;
			var currentIdx = 1;
			while(selected["parent_id"] && (selected = mb_findItem(itemList, selected["parent_id"]))) {
				if(selected == -1)
					break;
				wayFromSelectedToRootItem[currentIdx] = selected;
				currentIdx++;
			}
			for (var j=0; j<wayFromSelectedToRootItem.length; j++)
			{
				if(wayFromSelectedToRootItem[j]["id"] == item["id"])
					return true;
				else if(wayFromSelectedToRootItem[j]["parent_id"] && wayFromSelectedToRootItem[j]["parent_id"] == item["parent_id"])
					return true;
			}
			return false;
		}
	}
	catch (err)
	{
		return false;
	}
}

function mb_findItem(itemList, id) {
	try
	{
		for (var i=0; i<itemList.length; i++)
		{
			if(itemList[i]["id"] == (""+id)) {
				return itemList[i];
			}
			else {
				if(itemList[i]["itemList"] && itemList[i]["itemList"].length > 0) {
					var subResult = mb_findItem(itemList[i]["itemList"], id);
					if(subResult != -1)
						return subResult;
				}
			}
		}
		return -1;
	}
	catch (err)
	{
		return -1;
	}
}

function mb_updateSelected(itemList, id) {
	try
	{
		var result = itemList;
		for (var i=0; i<result.length; i++)
		{
			if(result[i]["id"] == (""+id))
				result[i]["selected"] = "true";
			else if(result[i]["selected"] && result[i]["selected"] == "true")
				result[i]["selected"] = "false";

			if(result[i]["itemList"] && result[i]["itemList"].length > 0) {
				result[i]["itemList"] = mb_updateSelected(result[i]["itemList"], id);
			}
		}
		return result;
	}
	catch (err)
	{
		return itemList;
	}
}

function mb_extractVerticalList(itemTreeList) {
	try
	{
		var result = new Array();
		var length = 0;
		for (var i=0; i<itemTreeList.length; i++)
		{
			result[length] = new Array();
			result[length]["id"] = itemTreeList[i]["id"];			
			result[length]["title"] = itemTreeList[i]["title"];
			result[length]["url"] = itemTreeList[i]["url"];
			result[length]["parent_id"] = itemTreeList[i]["parent_id"];
			result[length]["level"] = itemTreeList[i]["level"];
			
			if(itemTreeList[i]["itemList"] && itemTreeList[i]["itemList"].length > 0) {
				var subResult = mb_extractVerticalList(itemTreeList[i]["itemList"]);
				if(subResult != -1)
					result = result.concat(subResult);
			}
			length = result.length;
		}
		return result;	
	}
	catch (err)
	{
		return -1;
	}
}
