var LittleTritone = function(d, set) {
	var $ = function(id) { return document.getElementById(id); };
	
	if (!set.scname) {
		return;
	};
	
	var jumpURL = 'http://twitter.com/' + set.scname;
	var baseURL = 'http://twitter.com/statuses/user_timeline.json?screen_name=' + set.scname + '&callback=JSONP.';
	
	var contID          = set.conID || 'LittleTryToneDisplayPane';
	
	var clLabelImage  = set.clLabelImage || './image/label.gif';
	var clLabelWidth  = set.clLabelWidth || 11;
	var clLabelMargin = set.clLabelMargin || 5;
	var clBorderColor = set.clBorderColor || '#ada39d';
	
	var hdFontSize         = set.hdFontSize || 10;
	var hdMargin           = set.htMargin || 5;
	var hdLinkColor        = set.hdLinkColor || '#f46912';
	var hdCreatedTimeColor = set.hdCreatedTimeColor || '#ada39d';
	
	var tlUpButton   = set.tlUpButton || './image/bt_up.gif';
	var tlDownButton = set.tlDownButton || './image/bt_down.gif';
	var tlButtonSize = set.tlButtonSize || 10;
	var tlMargin     = set.tlMargin || 5;
	var tlIconWidth  = set.tlIconWidth || 42;
	var tlIconHeight = set.tlIconHeight || 42;
	var tlBGColor    = set.tlBGColor || '#f4eae5';
	var tlFontSize   = set.tlFontSize || 10;
	
	var ftTextColor = set.ftTextColor || '#c1c1c1';
	
	var maxURLLength    = set.maxURLLength || 20;
	var updateInterval  = set.updateInterval || 120000;
	
	var scname = set.scname;
	var script_id;
	
	var current_stream = [];
	var current_itemID = 0;
	
	var currenttime;
	var timerID;
	var loaded = false;
	
	var username;
	var usericon;
	var create_time;
	var canvas;
	
	var btUp;
	var btDown;
	
	
	if (updateInterval < 60000) {
		updateInterval = 60000;
	};
	
	
	var showTL = function()
	{
		var url = get_jsonp_url('show');
		
		if (!url) {
			return;
		};
		
		JSONP.get(url);
	};
	
	
	var updateTL = function()
	{
		var url = get_jsonp_url('update');
		
		if (!url) {
			return;
		};
		
		JSONP.get(url);
	};
	
	
	var get_jsonp_url = function(cbname)
	{
		if (!cbname) {
			return;
		};
		
		return baseURL + cbname;
	};
	
	
	var internal_show_timeline = function(json)
	{
		var table = d.createElement('table');
		table.border = '0';
		with(table.style) {
			borderCollapse = 'collapse';
			width          = '100%';
			border         =clBorderColor + ' 1px solid';
		};
		$(contID).appendChild(table);
		
		var tbody = d.createElement('tbody');
		table.appendChild(tbody);
		
		var tr1 = d.createElement('tr');
		tr1.style.textAlign     = 'left';
		tr1.style.verticalAlign = 'top';
		tbody.appendChild(tr1);
		
		var th = d.createElement('th');
		th.rowSpan           = '2';
		with(th.style) {
			width       = clLabelWidth + clLabelMargin * 2 + 'px';
			borderRight = clBorderColor + ' 1px dotted';
		};
		th.innerHTML = "<img src='" + clLabelImage + "' alt='on Twitter' style='margin:" + clLabelMargin + "px;' />";
		tr1.appendChild(th);
		
		username = d.createElement('div');
		with(username.style) {
			fontSize    = hdFontSize + 'px';
			lineHeight  = hdFontSize + 'px';
			paddingLeft = hdMargin + 'px';
			paddingTop  = hdMargin + 'px';
			fontWeight  = 'bold';
		}
		
		var td1l = d.createElement('td');
		td1l.appendChild(username);
		tr1.appendChild(td1l);
		
		create_time = d.createElement('div');
		with(create_time.style) {
			fontSize     = hdFontSize + 'px';
			lineHeight   = hdFontSize + 'px';
			paddingRight = tlButtonSize + tlMargin * 2 + 'px';
			paddingTop   = hdMargin + 'px';
			color        = hdCreatedTimeColor;
			fontWeight   = 'bold';
		};
		
		var td1r = d.createElement('td');
		td1r.style.textAlign = 'right';
		td1r.appendChild(create_time);
		tr1.appendChild(td1r);
		
		var tr2 = d.createElement('tr');
		tr2.style.verticalAlign = 'top';
		tbody.appendChild(tr2);
		
		var td2 = d.createElement('td');
		td2.colSpan = '2';
		tr2.appendChild(td2);
		
		var table2 = d.createElement('table');
		table2.border      = '0';
		table2.cellPadding = '0';
		table2.cellSpacing = tlMargin;
		table2.style.width = '100%';
		td2.appendChild(table2);
		
		var tbody2 = d.createElement('tbody');
		table2.appendChild(tbody2);
		
		var t2tr1 = d.createElement('tr');
		with(t2tr1.style) {
			textAlign     = 'left';
			verticalAlign = 'top';
		};
		tbody2.appendChild(t2tr1);
		
		usericon   = d.createElement('div');
		var t2td1l = d.createElement('td');
		t2td1l.rowSpan = 2;
		t2td1l.style.width = tlIconWidth + 'px';
		t2td1l.appendChild(usericon);
		t2tr1.appendChild(t2td1l);
		
		canvas = d.createElement('div');
		with(canvas.style) {
			fontSize   = tlFontSize + 'px';
			lineHeight = Math.round(tlFontSize * 1.5) + 'px';
			padding    = tlMargin + 'px';
		};
		
		var t2td1c = d.createElement('td');
		t2td1c.rowSpan = 2;
		with(t2td1c.style) {
			backgroundColor = tlBGColor;
			height          = Math.round(tlFontSize * 1.5) * 3 + tlMargin * 2 + 'px';
		};
		t2td1c.appendChild(canvas);
		t2tr1.appendChild(t2td1c);
		
		var bt1     = d.createElement('img');
		bt1.src     = tlUpButton;
		bt1.onclick = streamScrollUp;
		btUp = bt1;
		
		var t2td1r = d.createElement('td');
		t2td1r.style.width = tlButtonSize + 'px';
		t2td1r.appendChild(bt1);
		t2tr1.appendChild(t2td1r);
		
		var bt2     = d.createElement('img');
		bt2.src     = tlDownButton;
		bt2.onclick = streamScrollDown;
		btDown = bt2;
		
		var t2tr2 = d.createElement('tr');
		tbody2.appendChild(t2tr2);
		
		var t2td2 = d.createElement('td');
		t2td2.style.verticalAlign = 'bottom';
		t2td2.appendChild(bt2);
		t2tr2.appendChild(t2td2);
		/*
		var ltt = d.createElement('div');
		with(ltt.style) {
			paddingTop = clLabelMargin + 'px';
			textAlign  = 'center';
			fontSize   = hdFontSize + 'px';
			lineHeight = hdFontSize + 'px';
		};
		
		var anc = d.createElement('a');
		anc.setAttribute('href', 'http://www.f-sp.net/');
		anc.setAttribute('target', '_blank');
		with(anc.style) {
			color          = ftTextColor;
			textDecoration = 'none';
		};
		anc.innerHTML = 'powered by F# Lab.';
		
		ltt.appendChild(anc);
		$(contID).appendChild(ltt);
		*/
		json2tl(json);
	};
	
	
	var internal_update_timeline = function(json)
	{
		json2tl(json);
	};
	
	
	var set_user_info = function(obj)
	{
		var img = d.createElement('img');
		img.src = obj.profile_image_url;
		with(img.style) {
			width  = tlIconWidth + 'px';
			height = tlIconHeight + 'px';
			border = 'none';
		};
		
		var anc    = d.createElement('a');
		anc.href   = jumpURL;
		anc.target = '_blank';
		anc.appendChild(img);
		
		usericon.appendChild(anc);
		
		username.innerHTML = "<a href='" + jumpURL + "' target='_blank' style='text-decoration:none; color:" + hdLinkColor + ";'>" + obj.name + " (" + scname + ")</a>";
	};
	
	
	var json2tl = function(json)
	{
		if (!loaded) {
			set_user_info(json[0].user);
		};
		
		current_stream = [];
		current_itemID = 0;
		
		var date = new Date();
		currenttime = date.getTime();
		
		var i;
		for (i=0; i<json.length; i++) {
			var tlitem = json[i].text;
			
			var url = tlitem.match(/http:\/\/[\x21-\x7e]+/gi);
			if (url) {
				url = url[0];
				var lt = "<a href='" + url + "' target='_blank'>";
				
				if (url.length > maxURLLength) {
					url = url.substring(0, maxURLLength) + '...';
				};
				
				lt += url + "</a>";
				tlitem = tlitem.replace(/http:\/\/[\x21-\x7e]+/gi, lt);
			};
			
			var created = json[i].created_at.split(' ');
			created     = created[1] + ', ' + created[2] + ' ' + created[5] + ' ' + created[3] + ' GMT' + created[4];
			created     = Date.parse(created);
			var dt      = created;
			created     = Math.round((currenttime - created) * 0.001);
			
			if (created < 5) {
				created = '5秒以内';
			}
			else if (created < 30) {
				created = '30秒前';
			}
			else if (created < 60) {
				created = '1分前';
			}
			else {
				created = Math.round(created / 60);
				
				if (created < 60) {
					created = created + '分前';
				}
				else {
					var hour   = Math.floor(created / 60);
					var minute = created - hour * 60;
					
					if (hour < 24) {
						created = hour + '時間' + minute + '分前';
					}
					else {
						created = Math.round(hour / 24);
						
						if (created == 1) {
							created = '昨日';
						}
						else {
							created = created + '日前';
						};
					};
				};
			};
			
			current_stream[i] = [tlitem, created];
		};
		
		loaded = true;
		
		show_current_item();
	};
	
	
	var show_current_item = function()
	{
		canvas.innerHTML      = current_stream[current_itemID][0];
		create_time.innerHTML = current_stream[current_itemID][1];
		
		if (current_itemID < 1) {
			btUp.style.visibility = 'hidden';
		}
		else {
			btUp.style.visibility = 'visible';
		};
		
		if (current_itemID >= current_stream.length - 1) {
			btDown.style.visibility = 'hidden';
		}
		else {
			btDown.style.visibility = 'visible';
		};
		
		setTimeout(updateTL, updateInterval);
	};
	
	
	var get_child_id = function(num)
	{
		num = +num;
		
		return contID + '_child' + num;
	};
	
	
	JSONP = {
		get : function(url)
		{
			if (script_id) {
				d.body.removeChild($(script_id));
			};
			
			script_id = url;
			
			var s     = d.createElement('script');
			s.charset = 'UTF-8';
			s.id      = url;
			s.src     = url;
			s.type    = 'text/javascript';
			
			d.body.appendChild(s);
		},
		
		show : function(json)
		{
			internal_show_timeline(json);
		},
		
		update : function(json)
		{
			internal_update_timeline(json);
		}
	};
	
	
	var stream_scroll_by = function(num)
	{
		var newid = current_itemID + num;
		
		if (newid < 0 || newid >= current_stream.length) {
			return;
		};
		
		current_itemID = newid;
		show_current_item();
	};
	
	
	var streamScrollUp = function()
	{
		stream_scroll_by(-1);
	};
	
	
	var streamScrollDown = function()
	{
		stream_scroll_by(1);
	};
	
	
	window.onload = showTL;
};
