var listView, entryView, feedController;
function main() {
	feedController = new FeedController();
	listView = new gara.jsface.ListViewer(document.getElementById("list"), gara.jswt.JSWT.SINGLE);
	listView.setContentProvider(feedController);
	listView.setLabelProvider(feedController);
	listView.getControl().addSelectionListener(feedController);
	listView.setInput([]);

	var entryController = new EntryController();
	entryView = new gara.jsface.TableViewer(document.getElementById("entries"), gara.jswt.JSWT.SINGLE | gara.jswt.JSWT.FULL_SELECTION);
	entryView.setContentProvider(entryController);
	entryView.setLabelProvider(entryController);

	var entryTable = entryView.getTable();
	entryTable.setHeaderVisible(true);
	entryTable.addSelectionListener(entryController);

	var titleCol = new gara.jswt.TableColumn(entryTable);
	var publishCol = new gara.jswt.TableColumn(entryTable);

	titleCol.setText("Title");
	publishCol.setText("Published");

	var actionController = new ActionController();
	
	base2.DOM.EventTarget(document.getElementById("addFeed"));
	base2.DOM.EventTarget(document.getElementById("removeFeed"));
	
	gara.EventManager.addListener(document.getElementById("addFeed"), "click", actionController);
	gara.EventManager.addListener(document.getElementById("removeFeed"), "click", actionController);
	
	feedController.addFeed("http://sourceforge.net/export/rss2_projnews.php?group_id=177760");
	feedController.addFeed("http://ajaxian.com/index.xml");
	feedController.addFeed("http://www.heise.de/newsticker/heise-atom.xml");
}

$class("ActionController", {
	$constructor : function() {},

	handleEvent : function(e) {
		if (e.target.id == "addFeed") {
			var dlg = new gara.jswt.InputDialog();
			dlg.setText("Add Feed");
			dlg.setMessage("Enter Url");
			dlg.open(function(result) {
				if (result != null) {
					feedController.addFeed(result);
				}
			});
		}

		if (e.target.id == "removeFeed" && feedController.getActiveFeed() != null) {
			var feed = feedController.getActiveFeed();
			feedController.resetEntryView();
			feedController.removeFeed(feed);
		}
	}
});

$class("FeedController", {
	$implements : [gara.jsface.ILabelProvider, gara.jsface.IStructuredContentProvider, gara.jswt.SelectionListener],

	$constructor : function() {
		this._feeds = {};
		this._activeFeed = null;
		this._feedIcon = new Image();
		this._feedIcon.src = "icons/feed.png";
	},

	addFeed : function(url) {
		if (!this._feeds.hasOwnProperty(url)) {
			var feeds = this._feeds;
			var feed = new google.feeds.Feed(url);
			feed.setNumEntries(20);
			feed.load(function(result) {
  				if (!result.error) {
					feeds[url] = result.feed;
					listView.refresh();
				} else {
					var dlg = new gara.jswt.MessageBox(gara.jswt.JSWT.OK);
					dlg.setText("Error [" + result.error.code + "]");
					dlg.setMessage(result.error.message);
					dlg.open();
				}
			});
		}
	},
	
	getActiveFeed : function() {
		return this._activeFeed;
	},
	
	getImage : function(element) {
		return this._feedIcon;
	},

	getText : function(element) {
		return element.title;
	},

	getElements : function(inputElement) {
		var arr = [];
		for (f in this._feeds) {
			arr.push(this._feeds[f]);
		}
		return arr;
	},

	inputChanged : function(viewer, oldInput, newInput) {
		//this._model = newInput;
	},

	isLabelProperty : function(element, property) {},

	removeFeed : function(feed) {
		var offset = null;

		for (var url in this._feeds) {
			if (this._feeds[url] == feed) {
				offset = url;
			}
		}

		if (offset != null) {
			delete this._feeds[offset];
			listView.refresh();
		}
	},

	resetEntryView : function() {
		entryView.setInput([]);
		entryView.getControl().domref.style.visibility = "hidden";
		this._activeFeed = null;

		document.getElementById("feedTitle").innerHTML = "";
		document.getElementById("feedDesc").innerHTML = "";
		document.getElementById("body").innerHTML = "";
		document.getElementById("body").style.backgroundColor = "#EEE";
		document.getElementById("removeFeed").className = "inactive";
	},

	widgetSelected : function(widget) {
		if (widget.getSelectionCount()) {
			var feed = widget.getSelection()[0].getData();

			entryView.setInput(feed.entries);
			entryView.getControl().domref.style.visibility = "visible";
			
			var tbody = document.getElementsByTagName("tbody")[0];
			if (tbody.clientHeight > 207) {
				tbody.style.height = "207px";
			} else {
				tbody.style.height = "auto";	
			}

			if (this._activeFeed != feed) {
				document.getElementById("body").innerHTML = "";
				document.getElementById("body").style.backgroundColor = "#EEE";
			}

			this._activeFeed = feed;

			document.getElementById("feedTitle").innerHTML = feed.title;
			document.getElementById("feedDesc").innerHTML = feed.description;
			document.getElementById("removeFeed").className = "active";
		} else {
			this.resetEntryView();
		}
	}
});

$class("EntryController", {
	$implements : [gara.jsface.ITableLabelProvider, gara.jsface.IContentProvider, gara.jswt.SelectionListener],

	$constructor : function() {
		this._entries = null;
		this._selectedItem = null;
	},

	getColumnImage : function(element, columnIndex) {
		return null;
	},

	getColumnText : function(element, columnIndex) {
		switch(columnIndex) {
			case 0:
				return element.title;
			
			case 1:
				return element.publishedDate;
		}
		return null;
	},

	getElements : function(inputElement) {
		return this._entries;
	},

	inputChanged : function(viewer, oldInput, newInput) {
		this._entries = newInput;
	},

	isLabelProperty : function(element, property) {},
	
	widgetSelected : function(widget) {
		if (widget.getSelectionCount()) {
			var entry = widget.getSelection()[0].getData();
			document.getElementById("body").innerHTML = entry.content;
			document.getElementById("body").style.backgroundColor = "#FFF";
		} else {
			document.getElementById("body").innerHTML = "";
			document.getElementById("body").style.backgroundColor = "#EEE";
		}
	}
});


