/* expects that mootools is ready */

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}
	return [curleft,curtop];
}

var grablrApp = false;

function addToPage(user_id, container, nextOffset, type, id, status, data) {

	if(!grablrApp)  {
		grablrApp = new Grablr(user_id, type, id, container, status);
		grablrApp.loadingOffset = 0;
	}

	grablrApp.newItems(nextOffset, data);
	if(!grablrApp.loadingOffset)  
		grablrApp.selectItem(data[0]); 

}

var Grablr = new Class({
	initialize: function(user_id, type, id, container, status) {

		// this is the container 
		var e = new Element('div', {'class': 'grablrColumn'});
		$(container).adopt(e);


		this.isReader = false;
		/* make sure the first element clears the nanny */
		if($('nanny')) {
			this.isReader = true;
			var spc = new Element('div', {'class': 'topspacer'});
			spc.setStyle('height', $('nanny').getCoordinates().height + $('nanny').getCoordinates().top);
			$(e).adopt(spc);
		}

		this.container = e;
		this.user_id = user_id;
		this.container_id = container;
		this.usedOffsets = new Array();
		this.id = id;
		this.type = type;
		this.mainColumnPosition = 0;
		this.selectedItem = false;
		this.selectedInContextItem = false;
		this.status = status;
		this.lastItem = false;
		this.items = new Array();
		this.loadingOffset = 0;
		this.newlyReadItems = new Array();
		this.selectedText = '';
		$(this.container_id).style.position = 'absolute';

		this.offsetLeft = e.getCoordinates().left;
		

		new SmoothScroll({duration: 2800});

		$(window).addEvent('keypress', function(ev, i) { grablrApp.handleKeyPress(ev); });
		$(window).addEvent('scroll', this.handleScroll.pass(this)); // function() { this})
		$(window).addEvent('mouseup', this.handleTextSelection.pass(this));

	},
	
	
	newItems: function(nextOffset, data) {
		


		// I wanted to window.removeEvents('domready') for this, but 
		// it ALWAYS called the function at least twice, we'll just ignore them here
		for(var i = 0; i < this.usedOffsets.length; ++i)
			if(this.usedOffsets[i] == nextOffset) return;
		this.usedOffsets.push(nextOffset);

		// add the new items
		for(var i = 0; i < data.length; ++i) this.items.push(data[i]); 


		this.nextOffset = (nextOffset ? nextOffset : 0);

		for(var i = 0; i < data.length; ++i) { 
			this.lastItem = this.getItem(data[i], true);
			if(this.lastItem) {
				$(this.container).adopt(this.lastItem);
			}
		}

	},

	handleKeyPress: function(e) {
		var e = new Event(e);

		switch(e.key) {
		case 'n':
		case 's':
		case 'j':
			this.selectNext();
			break;
		case 'w':
		case 'p':
		case 'k':
			this.selectPrev();
			break;
		case 'd':
		case 'l':
			this.selectNextInContext();
			break;
		case 'a':
		case 'h':
			this.selectPrevInContext();
			break;
		case 'r':
			this.markRead(this.selectedItem);
			break;
		case 't':
			$(window).scrollTo(0, 0);
			break;
		}
	},

	handleScroll: function(o) {
		t = findPos(o.lastItem);
		if(t[1] <= (window.innerHeight + window.getScrollTop()))
			o.loadNext(o);
	},

	handleTextSelection: function(o) {
		grablrApp.selectedText = window.getSelection().toString();
	},

	loadNext: function(o) {
		if(this.loadingOffset != o.nextOffset) {
			this.loadingOffset = o.nextOffset;
 			var js = new Element('script', {'language': 'JavaScript', 'type': 'text/javascript'});
 			js.setAttribute('src', "/paginated/" + o.type + "/" + o.id + "?init=" + o.container_id + "&offset=" + o.nextOffset + "&status=" + o.status);
			
			$(document.head).adopt(js);

			if(pageTracker._trackPageview) 
				pageTracker._trackPageview("/" + o.type + "/" + o.id + "/" + o.status + "/offset/" + o.nextOffset);

		}
	},

	unselectItem: function() {
		$ES('div[class*=selected]').each(function(el, i) { el.removeClass('selected'); });
		$ES('div[class=grablrContext]').each( function(el, i) {el.remove(); });
	},
	unslideColumn: function(start) {
			new Fx.Style($(this.container_id), 'left').start(start, 0);
	},

	displayItemAsRead: function(item) {
		var i = $E('div[class=grablrColumn]').getElementById('item'+item.id);
		this.newlyReadItems.push(item);

		if(c = i.getElement('div[class=content]'))
			c.style.display = 'none'; 
		if(h = i.getElement('div[class=header]'))
			h.addClass('newlyread');

	},

	markRead: function(item) {
		if(!item.isRead) {
			item.isRead = true;
			var url = '/ajax/mark/read/' + item.id;
			$('item_read_' + item.id).title = "Marked as Read";
			new Ajax(url, {
				method: 'get',
				onComplete: function(result) { grablrApp.displayReadStatus(result) },
			}).request();
		}
	},

	scroll: function(item) {
		var coords = $("item" + item.id).getCoordinates();
// 		var fx = new Fx.Scroll($(window));
// 		fx.scrollTo(0, coords.top);
//		console.log("scrollto: %o, %o", 0, (coords.top - 30));
//		console.log($('nanny').getCoordinates().);
		var x = 0;
		var y = $('nanny').getCoordinates().height;
//		console.log("%o, %o", x, y);
 		var fx = new Fx.Scroll($(window));
 		fx.scrollTo(0, coords.top - y);
//		$(window).scrollTo(0, coords.top - y);
	},

	getNext: function(item) {
		for(var i = 0; i < this.items.length; ++i) {
			if(this.items[i] == item) {
				if(this.items[i+1]) 
					return this.items[i+1];
			}
		}
		return false; 
	},


	selectNext: function() {
		var found = this.selectedItem;
		
		while(found = this.getNext(found)) {
			if(!this.newlyReadItems.contains(found))
				break;
		}

		if(found) {
			this.scroll(found); // this.items[i+1]);
			this.selectItem(found);
		}

	},

	selectPrev: function() {
		var found = false;
		for(var i = 0; i < this.items.length; ++i) {
			if(this.items[i] == this.selectedItem) {
				if(this.items[i-1]) {
					this.scroll(this.items[i-1]);
					this.selectItem(this.items[i-1], false);
					found = true;
				}
				break;
			}
		}
		if(!found) {
			if(this.items.length && this.items[this.items.length - 1]) {
				this.scroll(this.items[this.items.length - 1]);
				this.selectItem(this.items[this.items.length - 1], false);
			}
		}
	},


	selectPrevInContext: function(){
		if(!this.isReader) return;
		var el = this.getAllItemsInContext(this.selectedItem);
		var item = this.selectedInContextItem = this.getPrevItemInContext(this.selectedInContextItem ? 
																		  this.selectedInContextItem : 
																		  this.selectedItem);
		
		if(item) {
			
			var element = $('context' + item.id);
			if(!element) element = $('item' + item.id);
			if(!element) return;
			
			// we have an item, clear the selection
			$ES("div[class*=selected]").each(function(sel) { sel.removeClass('selected'); });

			var pos = element.getCoordinates();
			element.addClass('selected'); 
			var columnPos = $E('div[class=grablrColumn]').getCoordinates();			
 			new Fx.Style($(this.container_id), 'left', { 
				onComplete: function() {
 					setTimeout(function(){ 
 						if(grablrApp.selectedInContextItem == item) { 
 							grablrApp.displayItemAsRead(item);
 							grablrApp.markRead(item);
 						} 
 					}, 1000);
				}
 			}).start(columnPos.left, columnPos.left + (pos.width + this.offsetLeft));
		}

	},

	selectNextInContext: function(){
		if(!this.isReader) return;
		var el = this.getAllItemsInContext(this.selectedItem);

		var item = this.getNextItemInContext(this.selectedInContextItem ? 
											 this.selectedInContextItem : 
											 this.selectedItem);

		if(item) {
			var element = $('context' + item.id);
			if(!element) return;

			// ok, we've got everything, let's do this
			this.selectedInContextItem = item;
			$ES("div[class*=selected]").each(function(sel) { sel.removeClass('selected'); });
			var pos = element.getCoordinates();
			element.addClass('selected'); 
			var columnPos = $E('div[class=grablrColumn]').getCoordinates();			
 			new Fx.Style($(this.container_id), 'left', { 
				onComplete: function() {
 					setTimeout(function(){ 
 						if(grablrApp.selectedInContextItem == item) { 
 							grablrApp.displayItemAsRead(item);
 							grablrApp.markRead(item);
 						} 
 					}, 1000);
				}
 			}).start(columnPos.left, columnPos.left - (pos.width + this.offsetLeft));

		}

	},



	getNextItemInContext: function(item) {
		return this.getItemInContext(item, 1);
	},

	getPrevItemInContext: function(item) {
		return this.getItemInContext(item, -1);

	},
	
	getItemInContext: function(item, relativePosition) {
		if(!this.isReader) return false;
		var context = this.getAllItemsInContext(item);
		for(var i = 0; i < context.length; ++i) {
			if(context[i] == item) {
				if(context[i + relativePosition]) 
					return context[i + relativePosition];
				else break;
			}
		}
		return false;
	},

	getAllItemsInContext: function(item) {
		var validItems = new Array();
		if(!this.isReader) return validItems;
		for(var i = 0; i < this.items.length; ++i) {
			if(this.items[i].source_id == item.source_id) 
				validItems.push(this.items[i]);
		}
		return validItems;
	},

	selectItem: function(item, ev) {
		
		if(this.isReader)
			setTimeout(function(){ if(grablrApp.selectedItem == item) { grablrApp.markRead(item) } }, 1000);
		// unselect the already selected stuff
		this.unselectItem();

		// select this one
		$("item" + item.id).addClass('selected');

		var coords = $("item" + item.id).getCoordinates();
		if(item.id == this.selectedItem.id) { 
			if(coords.left < 0) this.unslideColumn(coords.left);
			return;
		}
		else this.selectedItem = item;
		
		if(coords.left < 0) { 
			this.unslideColumn(coords.left);
			coords.right = coords.width;
		}

		var firstColumn = $E('div[class=grablrColumn]');

		validItemsAfter = new Array();

		var i = item;
		while(next = this.getNextItemInContext(i)) {
			validItemsAfter.push(next);
			i = next;
		}

		var last = $("item" + this.selectedItem.id);
		var clickedElement = $("item" + this.selectedItem.id);
		var offsetTop = firstColumn.getCoordinates().top;

		for(var x = 0; x < validItemsAfter.length; ++x) {

			var place = findPos(last);
			var e = new Element('div', {'class': 'grablrContext'});

			var pos = last.getCoordinates();

			$(e).style.position = "absolute";
			$(e).style.top = (pos.top - offsetTop) + "px";
			$(e).style.left = pos.right + "px";
			e.adopt(this.getItem(validItemsAfter[x]));

			$(this.container_id).adopt(e);

			var cid = this.container_id;
			var cx = x;
			e.addEvent('click', 
					   function (event) { 
						   var elementPos = this.getCoordinates();
						   var columnPos = $E('div[class=grablrColumn]').getCoordinates();
						   if(elementPos.left > 600)
							   new Fx.Style($(cid), 'left').start(columnPos.left, columnPos.left - (600 + grablrApp.offsetLeft));
						   else 
							   new Fx.Style($(cid), 'left').start(columnPos.left, columnPos.left + (600 + grablrApp.offsetLeft) );

					   });

			last = e;
		}		
		
	},


	prepareForSelection: function(el, item) {
		$(el).addEvent('click', this.selectItem.pass([item, el], this));
	},

	
	displayReadStatus: function(result) {
		var result = Json.evaluate(result);
		if(result.status == true) {
			status = 'status_read';
			var el = $ES('div[id=item_read_' + result.item_id + ']');
			for(var i = 0; i < el.length; ++i) {
				$(el[i]).removeClass('loading');
				$(el[i]).addClass(status);
			}
		}
	},

	displayUnreadStatus: function(result) {
		var result = Json.evaluate(result);
		if(result.status == true) {
			status = 'status_unread';
			var el = $ES('div[id=item_read_' + result.item_id + ']');
			for(var i = 0; i < el.length; ++i) {
				$(el[i]).removeClass('loading');
				$(el[i]).addClass(status);
			}
		}
	},


	/* not right, shouldn't display bad on error */
	displayRatingStatus: function(result) {
		var result = Json.evaluate(result);
		var status = 'status_bad';
		if(result.status == true) 
			status = 'status_good';
		var el = $ES('div[id=ratings_' + result.item_id + ']');
		for(var i = 0; i < el.length; ++i) {
			$(el[i]).removeClass('loading');
			$(el[i]).addClass(status);
		}
	},

	displayToReadStatus: function(result) {
		var result = Json.evaluate(result);
		var status = 'status_toreaderror';
		if(result.status == true) 
			status = 'status_toreadsaved';
		var el = $ES('div[id=toread_' + result.item_id + ']');
		for(var i = 0; i < el.length; ++i) {
			$(el[i]).removeClass('loading');
			$(el[i]).addClass(status);
		}
	},


	showNoteEditor: function(event, item) {
		var el = $('item' + item.id);
		var coords = el.getCoordinates();

		// container
		var st = new Element('div', {'class': 'note_edit_container', 'id': 'note_edit_' + item.id});

		var panel = new YAHOO.widget.Panel("panel_seven", 
			{ 
				close:true,  
				visible:true,  
				draggable:true,
				x: event.page.x,
				y: event.page.y,
				effect:{effect:YAHOO.widget.ContainerEffect.FADE, duration: 0.5}
				
			} 
												); 
		panel.setHeader('Notes on \"' + item.title + '\"');
		panel.setBody('');
		panel.setFooter('');
		panel.render(document.body);
		
		// textbox 
		var txt = new Element('textarea', {'id': 'note_text_' + item.id, 'cols': 50, 'rows': 10} );
		if(item.note_body)
			txt.value = item.note_body;
		$(panel.body).adopt(txt)
		el.adopt(st);
		


		// YAHOO!
		var myEditor = new YAHOO.widget.Editor('note_text_' + item.id, { 
			height: '300px', 
			width: '522px', 
			focusAtStart: true,
//			dompath: true, //Turns on the bar at the bottom 
			animate: false, //Animates the opening, closing and moving of Editor windows 
			toolbar: {
				titlebar: false, // 
				buttons: [ 
					{ group: 'textstyle', label: 'Font Style', 
	                  buttons: [ 
	                      { type: 'push', label: 'Bold', value: 'bold' }, 
	                      { type: 'push', label: 'Italic', value: 'italic' }, 
	                      { type: 'push', label: 'Underline', value: 'underline' }, 
//	                      { type: 'push', label: 'Save', value: 'save' }, 
	                      { type: 'separator' }, 
	                      { type: 'select', label: 'Default', value: 'fontname', disabled: true, 
	                        menu: [ 
	                            { text: 'Arial' }, 
	                            { text: 'Arial Black' }, 
	                            { text: 'Comic Sans MS' }, 
	                            { text: 'Courier New' }, 
	                            { text: 'Lucida Console' }, 
	                            { text: 'Tahoma' }, 
	                            { text: 'Times New Roman' }, 
	                            { text: 'Trebuchet MS' }, 
	                            { text: 'Verdana' } 
	                        ] 
	                      }, 
	                      { type: 'spin', label: '13', value: 'fontsize', range: [ 9, 75 ], disabled: true }, 
	                      { type: 'separator' }, 
	                      { type: 'color', label: 'Font Color', value: 'forecolor', disabled: true }, 
	                      { type: 'color', label: 'Background Color', value: 'backcolor', disabled: true },
	                      { type: 'separator' }, 
						  { type: 'push', label: 'HTML Link', value: 'createlink', disabled: true }
	                  ] 
					},
					{ group: 'grablrstuff', label: 'Save',
					  buttons: [
						  { type: 'separator' }
					  ]
					}
				]
			}

		}); 

		panel.beforeHideEvent.subscribe(function() { myEditor.saveHTML(); item.note_body = $('note_text_' + item.id).value;});

		myEditor.on('toolbarLoaded', function() 
					{
						var saveNote = { type: 'push', label: 'Save this note', value: 'save' }; 
						this.toolbar.addButtonToGroup(saveNote, 'grablrstuff'); 
						this.toolbar.on('saveClick', function() { 
							panel.setFooter('Saving...');
							myEditor.saveHTML();
							var url = '/ajax/note/save/' + item.id;
							new Ajax(url, {
								method: 'post',
								data: "body=" + $('note_text_' + item.id).value,
								onComplete: function(status) {
									panel.hide()
//												 }).start(100, 0);

								}
							}).request();
							
						});
					}
				   );
		myEditor.render(); 		


	},

	setupBasics: function(i, item, isMain)  {
		if(isMain) 
			this.prepareForSelection(i, item);
		var header = new Element('div', {'class': 'header'});
			
		var title = new Element('div', {'class': 'title'});
		var a = new Element('a', {'name': 'item_head_' + item.id});
		a.setHTML('');
		header.adopt(a);
		title.setHTML(item.title);
		header.adopt(title);

		var dt = new Element('div', {'class': 'date'});
		var full = new Element('span', {'class': 'full'});
		full.setHTML(item.date);
		dt.adopt(full);
/*
		var dateHash = new Hash(item.date_data);
		dateHash.each(function(v, k) {
			var d = new Element('span', {'class': k});
			d.setHTML(v);
			dt.adopt(d);
		});
 */	

		header.adopt(dt);

		var st = new Element('div', {'class': 'sourcetitle'});
		var a = new Element('a', {'href': '/source/' + item.source_id});
		a.setHTML(item.source_title);
		st.adopt(a);
		header.adopt(st);
		

		if(this.user_id) {

			header.addEvent('mouseenter', 
							function(ev) {
 								var fx = new Fx.Style('tools_'+item.id, 'opacity');
								fx.start(0, 1);
							});
			header.addEvent('mouseleave', 
							function(ev) {
								var fx = new Fx.Style('tools_'+item.id, 'opacity');
								fx.start(1, 0);
							});	


			var ratings = new  Element('div', {'class':  'ratings', 'id': 'ratings_' + item.id});
			var tools = new  Element('div', {'class':  'tools', 'id': 'tools_' + item.id, opacity: 0.0});
			
			if(item.marked_good) {
				var good = new Element('div', {'class': 'status_good', 'id': 'good_' + item.id});
				$(good).title = "Marked Good";
				ratings.adopt(good);
			}
			else if(item.marked_bad) {
				var bad = new Element('div', {'class': 'status_bad', 'id': 'bad_' + item.id});
				$(bad).title = "Marked Good";
				ratings.adopt(bad);
			}
			else {
				var good = new Element('div', {'class': 'mark_good', 'id': 'good_' + item.id});
				$(good).style.cursor = 'pointer';
				$(good).title = 'Good';
				$(good).addEvent('click', function(e) {
					e = new Event(e).stop();
					var url = '/ajax/mark/good/' + item.id;
					$('ratings_' + item.id).setHTML();
					$('ratings_' + item.id).addClass('loading');
					new Ajax(url, {
						method: 'get',
						onComplete: function(status) {
							grablrApp.displayRatingStatus(status);
						}
					}).request();
					$(good).style.cursor = '';
				});
				ratings.adopt(good);

				var bad = new Element('div', {'class': 'mark_bad', 'id': 'bad_' + item.id});
				$(bad).style.cursor = 'pointer';
				$(bad).title = 'Bad';
				$(bad).addEvent('click', function(e) {
					e = new Event(e).stop();
					var url = '/ajax/mark/bad/' + item.id;
					$('ratings_' + item.id).setHTML();
					$('ratings_' + item.id).addClass('loading');
					new Ajax(url, {
						method: 'get',
						onComplete: function(status) {
							grablrApp.displayRatingStatus(status);
						}
					}).request();
					$(bad).style.cursor = '';
				});
				ratings.adopt(bad);
			}

			tools.adopt(ratings);


			var toread = new Element('div', {'class': 'mark_toread', 'id': 'toread_' + item.id});
			$(toread).style.cursor = 'pointer';
			$(toread).title = 'Read Later';
			$(toread).addEvent('click', function(e) {
				e = new Event(e).stop();
				var url = '/ajax/mark/toread/' + item.id;
				$('toread_' + item.id).removeClass('mark_toread');
				$('toread_' + item.id).addClass('loading');

				new Ajax(url, {
					method: 'get',
					onComplete: function(status) {
						grablrApp.displayToReadStatus(status);
					}
				}).request();
				$(toread).style.cursor = '';
				$(toread).title = 'Saved for later';
			});
			tools.adopt(toread);


			var note_class = (item.note_body ? 'note_edit' : 'note');
			var note = new Element('div', {'class': note_class, 'id': 'note_' + item.id});
			$(note).style.cursor = 'pointer';
			$(note).title = 'Make Note';
			$(note).addEvent('click', function(e) {
				e = new Event(e).stop();
				// FIXME: somehow get this to "this"
				grablrApp.showNoteEditor(e, item);
			});
			tools.adopt(note);


			var rstatus = new  Element('div', {'class':  'readstatus', 'id': 'item_read_' + item.id});
			tools.adopt(rstatus);

//			var outside_tools = new  Element('div', {'class':  'outside_tools', 'id': 'outside_tools_' + item.id});

			var share_tumblr = new Element('div', {'class': 'mark_share_tumblr', 'id': 'share_tumblr_' + item.id});
			$(share_tumblr).style.cursor = 'pointer';
			$(share_tumblr).title = 'Share on Tumblr';

			// don't clear selection when clickin on this thing.
			$(share_tumblr).addEvent('mousedown', function(ev) { 
				ev = new Event(ev).stop();
			});

			$(share_tumblr).addEvent('click', function(ev) {
				ev = new Event(ev).stop();
				url = 'http://www.tumblr.com/share?v=3&u='+encodeURIComponent(item.url) +'&t='+encodeURIComponent(item.title) +'&s='+encodeURIComponent(grablrApp.selectedText)
				window.open(url,'tumblrPopup','toolbar=0,resizable=1,scrollbars=1,status=1,width=450,height=430');
			});
			tools.adopt(share_tumblr);


			var share_delicious = new Element('div', {'class': 'mark_share_delicious', 'id': 'share_delicious_' + item.id});
			$(share_delicious).style.cursor = 'pointer';
			$(share_delicious).title = 'Bookmark on del.icio.us';

			// don't clear selection when clickin on this thing.
			$(share_delicious).addEvent('mousedown', function(ev) { 
				ev = new Event(ev).stop();
			});

			$(share_delicious).addEvent('click', function(ev) {
				ev = new Event(ev).stop();
				url='http://del.icio.us/post?v=4;url='+encodeURIComponent(item.url)+';title='+encodeURIComponent(item.title)+';notes='+encodeURIComponent(grablrApp.selectedText);
//				url = 'http://www.delicious.com/share?v=3&u='+encodeURIComponent(item.url) +'&t='+encodeURIComponent(item.title) +'&s='+encodeURIComponent(grablrApp.selectedText)
				window.open(url,'deliciousPopup','toolbar=0,resizable=1,scrollbars=1,status=1,width=800,height=350');
			});
			tools.adopt(share_delicious);

			header.adopt(tools);
			
//			header.adopt(outside_tools);

		}

		var dt = new Element('div', {'class': 'sourcelink', 'title': 'View original article'});
		var a = new Element('a', {'href': item.url});
		a.setHTML("&rarr;");
		dt.adopt(a);
		header.adopt(dt);

		i.adopt(header);

	},

	getItem: function(item, isMain) {
		if((typeof isMain) == 'undefined') isMain = false;
		if(item.type == 'rss')
			return this.getItemBlog(item, isMain);
		else if(item.type == 'delicious')
			return this.getItemDelicious(item, isMain);
		else if(item.type == 'twitter')
			return this.getItemTwitter(item, isMain);
		else if(item.type == 'flickr')
			return this.getItemFlickr(item, isMain);
		else if(item.type.indexOf('tumblr:') == 0)
			return this.getItemTumblr(item, isMain);
	},

	getItemTumblr: function(item, isMain) {
		var type = item.type.substr(item.type.indexOf(':') + 1, item.type.length);
		if((type == 'photo') || (type == 'link') || (type == 'quote')) item.title = '';
		if(item.title.length > 50) item.title = item.title.substr(0, 50) + "...";

		var n = (isMain ? 'item' : 'context');
		var i = new Element('div', {'class': 'post tumblr ' + type, 'id': n + item.id});

		this.setupBasics(i, item, isMain);

		var content = new Element('div', {'class': 'content'});

		var text = '';
		var tumblr = Json.evaluate(item.content);


		if(tumblr.type == 'photo') {
			var img = new Element('img');
			for(var x = 0; x < tumblr.photo_url.length; ++x) 
				if(tumblr.photo_url[x]['max-width'] == 500) 
					img.setAttribute('src', tumblr.photo_url[x]['_content']);

			content.adopt(img);

			var cap = new Element('div', {'class': 'caption'});
			cap.setHTML(tumblr.photo_caption);
			content.adopt(cap);
		}
		

		if(tumblr.type == 'link') {
			var a = new Element('a', {'class': 'link'});
			a.setAttribute('href', tumblr.link_url);
			a.setHTML((tumblr.link_text && tumblr.link_text.length) ? tumblr.link_text : tumblr.link_url);
			content.adopt(a);

			var cap = new Element('div', {'class': 'caption'});
			cap.setHTML(tumblr.link_description);
			content.adopt(cap);

		}

		if(tumblr.type == 'regular') {
			content.setHTML(tumblr.regular_body);
		}

		if(tumblr.type == 'quote') {

			var q = new Element('div', {'class': 'quotetext'});
			q.setHTML(tumblr.quote_text);
			content.adopt(q);

			var a = new Element('div', {'class': 'source'});
			a.setHTML(tumblr.quote_source);
			content.adopt(a);

		}


		if(tumblr.type == 'audio') {		

			var play = new Element('div', {'class': 'player'});
			play.setHTML(tumblr.audio_player);
			content.adopt(play);

			if(tumblr.audio_caption) {
				var cap = new Element('div', {'class': 'caption'});
				cap.setHTML(tumblr.audio_caption);
				content.adopt(cap);
			}
		}

		if(tumblr.type == 'video') {		

			var play = new Element('div', {'class': 'player'});
			play.setHTML(tumblr.video_player);
			content.adopt(play);

			if(tumblr.video_caption) {
				var cap = new Element('div', {'class': 'caption'});
				cap.setHTML(tumblr.video_caption);
				content.adopt(cap);
			}
		}

		if(tumblr.type == 'conversation') {		

			for(var x = 0; x < tumblr.conversation_line.length; ++x) {
				var line = new Element('div', {'class': 'line'});
				
				if(tumblr.conversation_line[x]['name'] || tumblr.conversation_line[x]['_content']) {
					var name = tumblr.conversation_line[x]['name'] ? tumblr.conversation_line[x]['name'] : '';
					var data = tumblr.conversation_line[x]['_content'] ? tumblr.conversation_line[x]['_content'] : '';
					line.setHTML("<strong>" + name + '</strong>&raquo; ' + data);
				}
				else  {
					line.setHTML('...'); 
					line.setStyle('marginLeft', '1em');
					line.addClass('whisper');
				}
				content.adopt(line);
			}
		}




		this.setupImages(content);		

		i.adopt(content);
		return i;
	},

	getItemDelicious: function(item, isMain) {

		var type = item.type.substr(item.type.indexOf(':') + 1, item.type.length);
		var link_title = item.title;
		item.title = '';

		var n = (isMain ? 'item' : 'context');
		var i = new Element('div', {'class': 'post delicious ' + type, 'id': n + item.id});

		this.setupBasics(i, item, isMain);

		var content = new Element('div', {'class': 'content'});
		
		var a = new Element('a', {'class': 'link'});
		a.setAttribute('href', item.url);
		a.setHTML(link_title);
		content.adopt(a);

		var cap = new Element('div', {'class': 'caption'});
		cap.setHTML(item.content);
		content.adopt(cap);
		i.adopt(content);
		return i;
	},


	getItemTwitter: function(item, isMain) {

		var n = (isMain ? 'item' : 'context');
		var i = new Element('div', {'class': 'post twitter', 'id': n + item.id});
		item.title = '';
		this.setupBasics(i, item, isMain);

		var content = new Element('div', {'class': 'content'});

		var q = new Element('div', {'class': 'quotetext'});
		q.setHTML(item.content);
		i.adopt(q);

		var a = new Element('div', {'class': 'source'});
		a.setAttribute('href', item.url);
		a.setHTML(item.author);
		i.adopt(a);

		return i;
	},


	
	getItemBlog: function(item, isMain) {
		var n = (isMain ? 'item' : 'context');
		var i = new Element('div', {'class': 'post blog', 'id': n + item.id});
		this.setupBasics(i, item, isMain);

		var content = new Element('div', {'class': 'content'});
		content.setHTML(item.content);
		this.setupImages(content);
		i.adopt(content);

		return i;
	},

	
	getItemFlickr: function(item, isMain) {
		var n = (isMain ? 'item' : 'context');
		var i = new Element('div', {'class': 'post flickr', 'id': n + item.id});
		this.setupBasics(i, item, isMain);

		var content = new Element('div', {'class': 'content'});

		var flickr = Json.evaluate(item.content);

		var img = new Element('img');

		var url = 'http://farm' + flickr.farm + 
			'.static.flickr.com/' + flickr.server +
			'/' + flickr.id + '_' + flickr.secret + '.jpg'
		img.setAttribute('src', url);
		content.adopt(img);

		if(flickr.description) {
			var cap = new Element('div', {'class': 'caption'});
			cap.setHTML(flickr.description);
			content.adopt(cap);
		}

		this.setupImages(content);
		i.adopt(content);

		return i;
	},



	setupImages: function(el) {
		var images = $ES('img', el);
		images.each(function(value, index) {
			// get them the right size
			var max = 540;
			// essentiall full screen images on grablr
			if(value.width > max) {
				var scale = (max / value.width);
				value.style.width = (scale * value.width) + "px"; 
				value.style.height = (scale * value.height) + "px"; 
			}
			else {
				if(1) {
				if(!value.align) { 
					var p = false;
//					if(value.width < (max / 2)) {
//						value.align = "left";
//					}
					
//					if(value.getParent().getTag() == 'p')
//						p = value.getParent();
//					else if((value.getParent().getTag() == 'a') &&
//							(value.getParent().getParent().getTag() == 'p'))
//						p = value.getParent().getParent();
//					
//					if(p) {
//						console.log("%s, %o", value.src, value.getNext());
//						p.style.float = 'left';
//						if(value.getNext()) 
//							value.align = 'left';
//						else {
//							console.log(value.getParent());
//							console.log("No next: %o ", value);
//						}
//					}

//					console.log(value.getParent().getTag()); 
//					value.align = "left";
				}
				}
//				
			}
		});
	},

	/* so i never end with a comma */
	dummy: function() {}
});
