var d = document;
var TOOL_FLAG_EACH_FOLLOWED = 1;
var TOOL_FLAG_FOLLOWED = 2;
var TOOL_FLAG_FRIEND = 3;
var OWN;
var LIST_USERS = [];
var LIST_USERS_MAP = {};
var LIST_USERS_DIV_MAP = {};
var RESIZE_HEADER = false;
TwitterAPI.SERVER = 'http://taj-proxy.appspot.com';
TwitterAPI.PATH = 'twitmgr';
Array.prototype.find = function(value) {
	for (var i=0; i<this.length; i++) {
		var val = this[i];
		if (val == value) {
			return i;
		}
	}
	return -1;
}
function debug(text) {
	$(d.body).append('DEBUG:' + text + '<br />');
}
function startLoading() {
	$('#loading').show();
}
function finishLoading() {
	$('#loading').fadeOut();
}
function selectCommand(selected) {
	$('#command_menu a').each(function(){ $(this).removeClass('selected'); });
	$('#command_option div').each(function(){ $(this).hide(); });
	$(selected).addClass('selected');
	$('#' + selected.id + '_opt').find('input,select').each(function() {
		$(this).attr('disabled', 'disabled');
	}).end().show();
}
function enableOptForm(cmdName) {
	$('#cmd_' + cmdName + '_opt').find('input,select').each(function() {
		$(this).attr('disabled', '');
	})
}
function showEditarea() {
	$('#editarea').animate({opacity: 1}, 500);
}
function getTwitterId(elem) {
	var id = elem.id;
	if (!id) return '';
	var index = id.lastIndexOf('_');
	if (index==-1) return '';
	return id.substr(index+1);
}
function resetEditareaSize() {
	var edit = $('#editarea');
	var top = edit.offset().top;
	var height = $(window).height();
	edit.css('height', (height - top - 55) + 'px');
}
function setPager(cmd, func, prev, next) {
	var pager = $('#cmd_' + cmd + '_opt .pager');
	if (prev + next == 0) {
		pager.empty();
		return;
	}
	var html = '';
	if (prev != 0) {
		html += '<a href="#" onclick="' + func + '(' + prev + '); return false;">«前へ</a> ';
	}
	if (next != 0) {
		html += '<a href="#" onclick="' + func + '(' + next + '); return false;">後へ»</a> ';
	}
	pager.html(html);
}
function getFollowers(cursor) {
	cursor = cursor ? cursor : -1;
	startLoading();
	var content = $('#editarea');
	content.empty();
	TwitterAPI.statuses.followers(function(list){
		var len = list.users.length;
		for (var i=0; i<len; i++) {
			var user = list.users[i];
			var html = getUserHtml(user, len-i);
			content.append(html);
		}
		setTimeout(setFollowersStatuses, 250);
		setPager('follower', 'getFollowers', list.previous_cursor, list.next_cursor);
	}, null, 'cursor=' + cursor);
}
function setFollowersStatuses() {
	TwitterAPI.friends.ids(function(friendsIds) {
		$('.tools').each(function() {
			var tid = getTwitterId(this);
			var isFriend = friendsIds.find(tid) >= 0
			setTools($(this), tid, isFriend ? TOOL_FLAG_EACH_FOLLOWED : TOOL_FLAG_FOLLOWED);
			if (isFriend) { $('#user_' + tid).addClass('friend'); }
		});
		finishLoading();
		hideFriends(d.getElementById('hideFriends'));
		showEditarea();
		enableOptForm('follower');
	});
}
function getFriends(cursor) {
	cursor = cursor ? cursor : -1;
	startLoading();
	var content = $('#editarea');
	content.empty();
	TwitterAPI.statuses.friends(function(list){
		var len = list.users.length;
		for (var i=0; i< len; i++) {
			var user = list.users[i];
			var html = getUserHtml(user, len-i);
			content.append(html);
		}
		$('.tools').each(function() {
			var tid = getTwitterId(this);
			setTools($(this), tid, TOOL_FLAG_FRIEND);
		});
		setTimeout(getFriendsStatuses, 250);
		setPager('friend', 'getFriends', list.previous_cursor, list.next_cursor);
	}, null, 'cursor=' + cursor);
}
function getFriendsStatuses() {
	TwitterAPI.followers.ids(function(followersIds) {
		$('.tools').each(function() {
			var tid = getTwitterId(this);
			if (followersIds.find(tid) >= 0) { $('#user_' + tid).addClass('follower'); }
		});
		finishLoading();
		hideFollowers(d.getElementById('hideFollowers'));
		showEditarea();
		enableOptForm('friend');
	});
}
function setTools(tools, tid, flag) {
	switch (flag) {
	case TOOL_FLAG_EACH_FOLLOWED :
		tools.html('<span><img src="style/icon_followed.gif" width="16" height="16" alt="">フォロー済み</span>');
		break;
	case TOOL_FLAG_FOLLOWED :
		tools.html(
			'<a href="#" onclick="followUser(' + tid + ');return false;">' +
				'<img src="style/icon_follow.gif" width="16" height="16" alt="" />フォローする</a>' +
			'<a href="#" onclick="blockUser(' + tid + ');return false;">' +
				'<img src="style/icon_block.gif" width="16" height="16" alt="" />ブロックする</a>'
		);
		break;
	case TOOL_FLAG_FRIEND :
		tools.html(
			'<a href="#" onclick="unfollowUser(' + tid + ');return false;">' +
				'<img src="style/icon_block.gif" width="16" height="16" alt="" />フォローをやめる</a>'
		);
		break;
	}
}
function getUserHtml(user, zIndex) {
	var html = '';
	var userUrl = 'http://twitter.com/' + user.screen_name;
	html +=
		'<div id="user_' + user.id + '">' +
		'<div class="clear"></div>' +
		'<div class="user" style="z-index: ' + zIndex + '">' +
			'<div class="tools" id="tools_' + user.id + '"></div>' +
			'<img src="' + user.profile_image_url + '" class="profile_image" width="48" height="48" alt="" />' +
			'<div class="name">' +
				'<a href="' + userUrl + '" target="_blank">' + user.screen_name + '</a>' +
				' / ' + user.name + ' ' +
				'<span class="userinfo">' +
				(!(user.url) ? '' : '　[<a href="' + user.url + '" target="_blank">site</a>]') +
				'　<a href="' + userUrl + '/following" target="_blank">' + user.friends_count + 'following</a>[s]' +
				'　<a href="' + userUrl + '/followers" target="_blank">' + user.followers_count + 'follower</a>[s]' +
				'</span>' +
			'</div>' +
			'<div class="description">' + (!(user.description) ? '' : formatText(user.description)) + '</div>' +
			'<div class="clear"></div>';
	if (user.protected) {
		html +=
			'<div class="tl">' +
			'<div class="tl_protected"><img src="style/icon_block.gif" width="16" height="16" alt="" />つぶやき非公開</div>' +
			'</div>' +
			'<div class="tl_margin" ></div>';
	} else if (user.status) {
		var date = new Date(user.status.created_at);
		html +=
			'<div class="tl" id="tl_' + user.id + '" style="z-index: ' + zIndex + '">' +
			'<div class="tl_down" id="tl_down_' + user.id + '">' +
				'<a href="" onclick="showTl(' + user.id + '); return false;">' +
					'<img src="style/arrow_down.gif" width="16" height="16" alt="" />最近のつぶやきを見る</a>' +
			'</div>' +
			'<div class="tl_up" id="tl_up_' + user.id + '">' +
				'<a href="" onclick="hideTl(' + user.id + '); return false;">' +
					'<img src="style/arrow_up.gif" width="16" height="16" alt="" />最近のつぶやきを隠す</a>' +
			'</div>' +
			'<div class="tl_status">総発言数：' + user.statuses_count + '　最終発言日時：' + formatDate(date, true) + '</div>' +
			'<div class="tl_content" id="tl_content_' + user.id + '"></div>' +
			'</div>' +
			'<div class="tl_margin" ></div>';
	} else {
		html +=
			'<div class="tl" id="tl_' + user.id + '" style="z-index: ' + zIndex + '">' +
			'<div class="tl_status">総発言数：0</div>' +
			'</div>' +
			'<div class="tl_margin" ></div>';
	}
	html +=
		'</div>' +
		'</div>'
	;
	return html;
}
function getList() {
	jConfirm(
		'フレンズ/フォロワの数が多い場合、処理に時間がかかります。続行しますか？<br /><br />' +
		'※数が多いほど動作がもっさりしてしまいます。現状では Chrome が優秀です。<br />' +
		'※極端に数が多いと (数千件以上) Twitter 側の API 制限によって続行不能になる可能性もあります。',
		'分析の確認',
		function(r) {
			if(r) {
				doGetList();
			} else {
				enableOptForm('list');
			}
		}
	);
}
function doGetList() {
	LIST_USERS = [];
	LIST_USERS_MAP = {};
	startLoading();	// ここで API を呼べば、HTML が描画されてローディングが回り始めるはず。
	var friendsMaxPage = Math.floor(OWN.friends_count / 100)+1;
	getAllFriends(1, friendsMaxPage);
	/*
	var len = 200;
	for (var i=0; i<len; i++) {
		var user = {profile_image_url: 'http://static.twitter.com/images/default_profile_normal.png'};
		user.id = (i+1);
		user.screen_name = 'dummy' + user.id;
		user.name = 'ダミー' + user.id;
		user.description = '';
		for (var j=0; j<i; j++) {
			user.description += '説明文。';
		}
		user.friends_count = (i*2);
		user.followers_count = (len-i);
		user.statuses_count = i*100;
		user.isFriend = ((i%2) == 0);
		user.isFollowed = !user.isFriend || ((i%3) == 0);
		user.created_at = new Date((new Date()).getTime() - i*10000);
		LIST_USERS.push(user);
	}
	*/
}
function getAllFriends(page, maxPage) {
	if (page > maxPage) {
		var followersMaxPage = Math.floor(OWN.followers_count / 100)+1;
		setTimeout('getAllFollowers(1 , ' + followersMaxPage + ')', 100);
	} else {
		TwitterAPI.statuses.friends(function(friends){
			for (var i=0; i< friends.length; i++) {
				var user = friends[i];
				user.isFriend = true;
				user.created_at = new Date(user.created_at);
				if (user.status) {
					user.status.created_at = new Date(user.status.created_at);
				}
				LIST_USERS.push(user);
				LIST_USERS_MAP[user.id] = user;
			}
			setTimeout('getAllFriends(' + (page+1) + ', ' + maxPage + ')', 100);
		}, null, 'page=' + page);
	}
}
function getAllFollowers(page, maxPage) {
	if (page > maxPage) {
		createList();
		changeListSort();
		enableOptForm('list');
	} else {
		TwitterAPI.statuses.followers(function(friends){
			for (var i=0; i< friends.length; i++) {
				var user = friends[i];
				var friend = LIST_USERS_MAP[user.id];
				if (friend) {
					friend.isFollowed = true;
				} else {
					user.isFollowed = true;
					user.created_at = new Date(user.created_at);
					if (user.status) {
						user.status.created_at = new Date(user.status.created_at);
					}
					LIST_USERS.push(user);
				}
			}
			setTimeout('getAllFollowers(' + (page+1) + ', ' + maxPage + ')', 100);
		}, null, 'page=' + page);
	}
}
function changeListView() {
	var view = $('#listView').val();
	$('#list').removeClass('icon_list').removeClass('detail_list').addClass(view + '_list');
	switch (view) {
	case 'icon' :
		$('.icon_list .u').width(225).find('.name').width(146).end().find('.description').width(160);
		break;
	case 'detail' :
		HEADER_ALL_WIDTH = 0;
		$('.detail_list .u').find('.name').width($('#head_name').width()).end().find('.description').width($('#head_description').width());
		$('#list_head div').each(function(){
			HEADER_ALL_WIDTH += $(this).width();
		});
		$('#list_head, .detail_list .u').width(HEADER_ALL_WIDTH);
		break;
	}
}
function changeListSort() {
	startLoading();
	var sort = $('#listSort').val();
	var comparator = false;
	switch(sort) {
		case 'icon'              : comparator = sortByIcon; break;
		case 'screen_name'       : comparator = sortByScreenName; break;
		case 'name'              : comparator = sortByName; break;
		case 'description'       : comparator = sortByDescription; break;
		case 'friends_count'     : comparator = sortByFriendsCount; break;
		case 'followers_count'   : comparator = sortByFollowersCount; break;
		case 'statuses_count'    : comparator = sortByStatusesCount; break;
		case 'status_created_at' : comparator = sortByStatusCreatedAt; break;
		case 'created_at'        : comparator = sortByCreatedAt; break;
	}
	if (comparator) {
		LIST_USERS.sort(comparator);
		if(d.getElementById('listReverse').checked) {
			LIST_USERS.reverse();
		}
		sortList();
	}
}
function changeListReverse() {
	LIST_USERS.reverse();
	sortList();
}
function swapSort(sort) {
	var listSort = $('#listSort');
	var currentSort = listSort.val();
	if (sort == currentSort) {
		var reverse = d.getElementById('listReverse');
		reverse.checked = !reverse.checked;
		changeListReverse();
	} else {
		listSort.val(sort);
		changeListSort();
	}
}
function sortByIcon(l, r) {
	if (l.isFriend != r.isFriend) {
		return l.isFriend ? -1 : 1;
	}
	if (l.isFollowed != r.isFollowed) {
		return l.isFollowed ? -1 : 1;
	}
	return sortByScreenName(l, r);
}
function sortByScreenName(l, r) {
	return l.screen_name < r.screen_name ? -1 : 1;
}
function sortByName(l, r) {
	if (l.name < r.name) {
		return -1;
	} else if (l.name > r.name) {
		return 1;
	} else {
		return sortByScreenName(l, r);
	}
}
function sortByDescription(l, r) {
	if (l.description != r.description) {
		return l.description < r.description ? -1 : 1;
	}
	return sortByScreenName(l, r);
}
function sortByFriendsCount(l, r) {
	var result = l.friends_count - r.friends_count;
	if (result != 0) return result;
	return sortByScreenName(l, r);
}
function sortByFollowersCount(l, r) {
	var result = l.followers_count - r.followers_count;
	if (result != 0) return result;
	return sortByScreenName(l, r);
}
function sortByStatusesCount(l, r) {
	var result = l.statuses_count - r.statuses_count;
	if (result != 0) return result;
	return sortByScreenName(l, r);
}
function sortByStatusCreatedAt(l, r) {
	if (l.status && r.status) {
		var result = l.status.created_at.getTime() - r.status.created_at.getTime();
		if (result != 0) return result;
		return sortByScreenName(l, r);
	} else if (l.status) {
		return 1;
	} else if (r.status) {
		return -1;
	} else {
		return sortByScreenName(l, r);
	}
}
function sortByCreatedAt(l, r) {
	var result = l.created_at.getTime() - r.created_at.getTime();
	if (result != 0) return result;
	return sortByScreenName(l, r);
}
function sortList() {
	var listBody = d.getElementById('list_body');
	listBody.innerHTML = '';
	var len = LIST_USERS.length;
	for (var i=0; i<len; i++) {
		var uid = LIST_USERS[i].id;
		var div = LIST_USERS_DIV_MAP[uid];
		listBody.appendChild(div);
	}
	finishLoading();
}
function resizeHeaderStart(pos) {
	if (this.id.substr(0, 5) != "split") return;
	var type = this.id.substr(6);
	RESIZE_HEADER = $('#head_' + type);
	HEADER_WIDTH = RESIZE_HEADER.width();
	RESIZE_HEADER_TARGET = $('.' + type);
	RESIZE_HEADER_START_X = pos.pageX;
	RESIZE_HEADER.css({opacity: '0.5'});
	HEADER_ALL_WIDTH = 0;
	$('#list_head div').each(function(){
		HEADER_ALL_WIDTH += $(this).width();
	});
}
function resizeHeader(pos) {
	if (!RESIZE_HEADER) return;
	var diff = pos.pageX - RESIZE_HEADER_START_X;
	var width = HEADER_WIDTH + diff;
	width = width > 2 ? width : 2;
	diff = width - HEADER_WIDTH;
	$('#list_head').width(HEADER_ALL_WIDTH + diff);
	RESIZE_HEADER.width(width);
}
function resizeHeaderFinish(pos) {
	if (!RESIZE_HEADER) return;
	var width = RESIZE_HEADER.width();
	var diff = width - HEADER_WIDTH;
	$('.detail_list .u').width(HEADER_ALL_WIDTH + diff);
	RESIZE_HEADER_TARGET.width(width);
	RESIZE_HEADER.css({opacity: '1'});
	RESIZE_HEADER = null;
}
function createList() {
	var view = $('#listView').val();
	var content = $('#editarea');
	content.empty();
	var html = '';
	html += '<div id="list" class="' + view + '_list">';
	html += '<div id="list_head">';
	html += '<div class="head icon"><a href="#" onclick="swapSort('+"'icon'"+');return false;">アイコン</a></div>';
	html += '<div class="head_split" style="cursor: default;"></div>';
	html += '<div class="head name" id="head_name">' +
			'<a href="#" onclick="swapSort('+"'screen_name'"+');return false;">ユーザー名</a> / ' +
			'<a href="#" onclick="swapSort('+"'name'"+');return false;">名前</a></div>';
	html += '<div class="head_split" id="split_name"></div>';
	html += '<div class="head description" id="head_description">' +
			'<a href="#" onclick="swapSort('+"'description'"+');return false;">自己紹介</a></div>';
	html += '<div class="head_split" id="split_description"></div>';
	html += '<div class="head friends_count" id="head_friends_count">' +
			'<a href="#" onclick="swapSort('+"'friends_count'"+');return false;">フレンズ</a></div>';
	html += '<div class="head_split" id="split_friends_count"></div>';
	html += '<div class="head followers_count" id="head_followers_count">' +
			'<a href="#" onclick="swapSort('+"'followers_count'"+');return false;">フォロワ</a></div>';
	html += '<div class="head_split" id="split_followers_count"></div>';
	html += '<div class="head statuses_count" id="head_statuses_count">' +
			'<a href="#" onclick="swapSort('+"'statuses_count'"+');return false;">発言数</a></div>';
	html += '<div class="head_split" id="split_statuses_count"></div>';
	html += '<div class="head status_created_at" id="head_status_created_at">' +
			'<a href="#" onclick="swapSort('+"'status_created_at'"+');return false;">最終発言日時</a></div>';
	html += '<div class="head_split" id="split_status_created_at"></div>';
	html += '<div class="head created_at" id="head_created_at">' +
			'<a href="#" onclick="swapSort('+"'created_at'"+');return false;">参加日時</a></div>';
	html += '<div class="head_split" id="split_created_at"></div>';
	html += '</div>';
	html += '<div id="list_body" class="clear">';
	var len = LIST_USERS.length;
	for (var i=0; i<len; i++) {
		var user = LIST_USERS[i];
		html += getListUserHtml(user);
	}
	html += '</div>';
	html += '</div>';
	content.append(html);
	showEditarea();
	LIST_USERS_DIV_MAP = {};
	for (var i=0; i<len; i++) {
		var user = LIST_USERS[i];
		var uid = user.id;
		var div = d.getElementById('user_' + uid);
		LIST_USERS_DIV_MAP[uid] = div;
	}
	$('.head_split').mousedown(resizeHeaderStart);
}
function getListUserHtml(user) {
	var html = '';
	var userUrl = 'http://twitter.com/' + user.screen_name;
	var userDescription = (!(user.description) ? '' : user.description);
	var follow = (user.isFriend && user.isFollowed) ? 'each' : (user.isFriend ? 'friend' : 'followed');
	html +=
		'<div id="user_' + user.id + '">' +
		'<div class="u ' + follow + '">' +
			'<input type="checkbox" class="checkbox" onclick="checkUser(this);" id="check_' + user.id + '" />' +
			'<img class="img" src="' + user.profile_image_url + '" alt="" />' +
			'<div class="name">' +
				'<a href="' + userUrl + '" target="_blank" title="' + user.screen_name + '">' + user.screen_name + '</a> / ' +
				'<span title="' + user.name + '">' + user.name + '</span>' +
			'</div>' +
			'<div class="description" title="' + userDescription + '">' + formatText(userDescription) + '</div>' +
			'<div class="friends_count">' + user.friends_count + '</div>' +
			'<div class="followers_count">' + user.followers_count + '</div>' +
			'<div class="statuses_count">' + user.statuses_count + '</div>' +
			'<div class="status_created_at">' + (user.status ? formatDate(user.status.created_at) : '-') + '</div>' +
			'<div class="created_at">' + formatDate(user.created_at) + '</div>' +
		'</div>' +
		'</div>'
	;
	return html;
}
function followUser(tid) {
	TwitterAPI.friendships.create(function() {}, tid);
	var tools = $('#tools_' + tid);
	setTools(tools, tid, TOOL_FLAG_EACH_FOLLOWED);
	tools.animate({backgroundColor: '#ffff66'}, 100).animate({backgroundColor: '#ffffff'}, 1000);
}
function blockUser(tid) {
	TwitterAPI.blocks.create(function() {}, tid);
	var user = $('#user_' + tid);
	user.fadeOut();
}
function unfollowUser(tid) {
	TwitterAPI.friendships.destroy(function() {}, tid);
	var user = $('#user_' + tid);
	user.fadeOut();
}
function showTl(tid) {
	var down = $('#tl_down_' + tid);
	var up = $('#tl_up_' + tid);
	var content = $('#tl_content_' + tid);
	if (content.html().length > 0) {
		down.hide();
		up.show();
		content.slideDown(250);
		return;
	}
	startLoading();
	TwitterAPI.statuses.user_timeline(function(arr) {
		down.hide();
		up.show();
		var html = '';
		for (var i=0; i<arr.length; i++) {
			var tl = arr[i];
			var date = new Date(tl.created_at);
			html += '<div class="tl_line tl_line_' + (i%2 == 0 ? 'even' : 'odd') + '">';
			html += formatText(tl.text);
			html += ' <span class="tl_created_at">(' + formatDate(date) + ')</span>';
			html += '</div>';
		}
		finishLoading();
		content.html(html).slideDown(250);
	}, tid);
}
function hideTl(tid) {
	$('#tl_down_' + tid).show();
	$('#tl_up_' + tid).hide();
	$('#tl_content_' + tid).slideUp(250);
}
function hideFriends(elem) {
	var hide = elem.checked;
	$('div.friend').each(function() {
		if(hide){ $(this).hide(); } else { $(this).show(); }
	});
}
function hideFollowers(elem) {
	var hide = elem.checked;
	$('div.follower').each(function() {
		if(hide){ $(this).hide(); } else { $(this).show(); }
	});
}
function checkUser(cb) {
	var tid = getTwitterId(cb);
	$('#user_' + tid + ' .u').css('background-color', cb.checked ? '#ffd' : '');
}
function formatText(text) {
	text = text.replace(new RegExp("(https?://[-/._&#%=?0-9a-z]+)", "ig"), '<a href="$1" target="_blank">$1</a>');
	text = text.replace(new RegExp("@([0-9a-z_]+)", "ig"), '<a href="http://twitter.com/$1" target="_blank">@$1</a>');
	return text;
}
function formatDate(date, withDiff) {
	var html = '';
	var diffStr = false;
	var clazz = false;
	while (withDiff) {
		var diff = (new Date()).getTime() - date.getTime();
		diff = diff / 1000;
		if (diff <= 60) {
			diffStr = '1分以内';
			break;
		}
		diff = diff / 60;
		if (diff < 60) {
			diffStr = '約' + Math.floor(diff) + '分前';
			break;
		}
		diff = diff / 60;
		if (diff < 24) {
			diffStr = '約' + Math.floor(diff) + '時間前';
			break;
		}
		diff = diff / 24;
		if (diff < 30) {
			diffStr = '約' + Math.floor(diff) + '日前';
			clazz = 'diff_day';
		} else if (diff < 60) {
			diffStr = '1ヶ月以上前';
			clazz = 'diff_1mon';
		} else if (diff < 90) {
			diffStr = '2ヶ月以上前';
			clazz = 'diff_2mon';
		} else {
			diffStr = '3ヶ月以上前';
			clazz = 'diff_3mon';
		}
		break;
	}
	if (clazz) {
		html += '<span class="' + clazz + '">';
	}
	html += date.getFullYear() + '-' +
		fillZero2(date.getMonth() + 1) + '-' +
		fillZero2(date.getDate()) + ' ' +
		fillZero2(date.getHours()) + ':' +
		fillZero2(date.getMinutes()) + ':' +
		fillZero2(date.getSeconds())
	;
	if (diffStr) { html += ' (' + diffStr + ')'; }
	if (clazz) { html += '</span>'; }
	return html;

}
function fillZero(value, len) {
	var str = value + '';
	while (str.length < len) { str = '0' + str; }
	return str;
}
function fillZero2(value) {
	return fillZero(value, 2);
}
function init() {
	$('#command_menu a').each(function(){ $(this).removeClass('selected'); });
	$('#command_option div').each(function(){ $(this).hide(); });
	$('#editarea').empty();
}
function relogin() {
	TwitterAPI.relogin(init);
}
$(function(){
	init();
	$(d.body).mousemove(resizeHeader).mouseup(resizeHeaderFinish);
});