/*
@name: MenuTree Library
@description: This library helps you to create hierarchical menus with unlimited level from an object, which contains data and is written in JSON format. You have full customization using CSS for menu nodes. Please change the function clickHandler() to catch click-event.
@website: http://rilwis.googlepages.com/menutree.html
@author: Tran Ngoc Tuan Anh
@author's website: http://rilwis.tk
@email: rilwis@yahoo.com
*/

// Create a menu from an object written in JSON format
function menuTree(menuData) {
	this.name = menuData.name;
	this.url = (menuData.url) ? menuData.url : '' ;
	this.desc = (menuData.desc) ? menuData.desc : '';
	
	// Create DOM node for menu
	this.render();
	
	// If it's a cursive menu, create a list of submenu and add it
	if (menuData.list) {
		this.list = new Array();
		for (var i = 0; i < menuData.list.length; i++) {
			this.list[i] = new menuTree(menuData.list[i]);
			this.list[i].parent = this;
			this.body.appendChild(this.list[i].html);
		}
		this.header.onclick = showHide;
		this.header.className = 'menuHeaderClosed';
	}
}

// Create DOM node menu
menuTree.prototype.render = function() {
	this.html = document.createElement('div');
	this.html.className = 'menuElement';
	
	// Create node for header
	this.header = document.createElement('div');
	this.header.className = 'itemHeader';
	this.header.me = this;
	this.header.onclick = clickHandler;
	var a = document.createElement('a');
	a.setAttribute('href', 'javascript:void(0)');
	a.appendChild(document.createTextNode(this.name));
	this.header.appendChild(a);
	
	// Create node for body
	this.body = document.createElement('div');
	this.body.className = 'menuBody';
	this.body.appendChild(document.createTextNode(this.desc));
	this.body.style.display = 'none';
	
	// Append header and body
	this.html.appendChild(this.header);
	this.html.appendChild(this.body);
}

// Toogle menu on/off
function showHide() {
	var obj = this.me;
	if (!obj.isMenu()) {
		return false;
	}
	if (obj.isOpened()) {
		obj.hideBody();
	} else {
		obj.showBody();
	}
	return false;
}

menuTree.prototype.showBody = function() {
	this.body.style.display = '';
	this.header.className = 'menuHeaderOpened';
}

menuTree.prototype.hideBody = function() {
	this.body.style.display = 'none';
	this.header.className = 'menuHeaderClosed';
}

menuTree.prototype.isOpened = function() {
	return (this.body.style.display == '');
}

// Show menu at place indentified by containerID
// showAll: expand menu on loaded, defaulted by false
// clear: clear the container before show menu, defaulted by false
menuTree.prototype.show = function(containerID, showAll, clear) {
	if (showAll == true && this.isMenu()) {
		this.header.className = 'menuHeaderOpened';
		this.body.style.display = '';
	}
	var container = $(containerID);
	if (clear == true) {
		container.innerHTML = '';
	}
	container.appendChild(this.html);
}

// Handler when click on menu items
function clickHandler() {
	var obj = this.me;
	var titleText = obj.name;
	var objParent = obj.parent;
	while (objParent) {
		titleText = objParent.name + ' &raquo; ' + titleText;
		objParent = objParent.parent;
	}
	$('title').innerHTML = titleText;
	showFeed(obj.url, 'entries');
}

function showFeed(feedUrl, containerID) {
	var feed = new google.feeds.Feed(feedUrl);
	feed.setNumEntries(20);
	feed.load(function(result) {
		if (!result.error) {
			var html = '<table border="0" width="98%">';
			for (var i = 0; i < result.feed.entries.length; i++) {
				var entry = result.feed.entries[i];
				if (i % 2 == 0) {
					html += '<tr>';
				}
				html += '<td width="45%" class="feedEntry" valign="top">';
				html += '<a class="feedEntryTitle" href="' + entry.link + '">' + entry.title + '</a>';
				html += '<div class="feedEntryTimestamp">' + entry.publishedDate + '</div>';
				html += '<div class="feedEntrySummary">' + entry.content + '</div>';
				html += '</td>';
			}
			html += '</table>';
			$(containerID).innerHTML = html;
		}
	});
}

menuTree.prototype.isMenu = function() {
    return (this.list) ? true : false;
}

// Reference to DOM node
function $(id) {
	return document.getElementById(id);
}